{
 "cells": [
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "# 构建文本纠错训练数据\n",
    "\n",
    "标准格式为：\n",
    "```jsonl\n",
    "\n",
    "{\"id\": \"A2-0011-1\",\"original_text\": \"你好！我是张爱文。\",\"correct_text\": \"你好！我是张爱文。\",\"errors\":[]}\n",
    "{\"id\": \"A2-0023-1\",\"original_text\": \"下个星期，我跟我朋唷打算去法国玩儿。\",\"correct_text\": \"下个星期，我跟我朋友打算去法国玩儿。\",\"errors\":[{\"index\": 9,\"original_error\": \"朋唷\",\"type\": \"spelling_error\",\"correct\": \"朋友\"}]}\n",
    "{\"id\": \"A2-0023-2\",\"original_text\": \"我听说，你找到新工作，我很高兴。\",\"correct_text\": \"我听说，你找到新工作，我很高兴。\",\"errors\":[]}\n",
    "{\"id\": \"A2-0029-1\",\"original_text\": \"对不气，最近我很忙，所以我不会去妳的。\",\"correct_text\": \"对不起，最近我很忙，所以我不会去你的。\",\"errors\":[{\"index\": 2,\"original_error\": \"不气\",\"type\": \"spelling_error\",\"correct\": \"不起\"},{\"index\": 22,\"original_error\": \"妳的\",\"type\": \"grammar_error\",\"correct\": \"你的\"}]}\n",
    "{\"id\": \"A2-0030-1\",\"original_text\": \"他去昨天了酒吧喝酒。\",\"correct_text\": \"他昨天去了酒吧喝酒。\",\"errors\":[{\"index\": 1,\"original_error\": \"去昨天了\",\"type\": \"grammar_error\",\"correct\": \"昨天去了\"}]}\n",
    "{\"id\": \"A2-0031-1\",\"original_text\": \"他昨天去了图书馆借了很多书籍。\",\"correct_text\": \"他昨天去了图书馆借了很多书。\",\"errors\":[{\"index\": 13,\"original_error\": \"书籍\",\"type\": \"extra_word\",\"correct\": \"书\"}]}\n",
    "{\"id\": \"A2-0032-1\",\"original_text\": \"今天我得去趟超市买牛奶。\",\"correct_text\": \"今天我得去一趟超市买牛奶。\",\"errors\":[{\"index\": 3,\"original_error\": \"去趟\",\"type\": \"missing_word\",\"correct\": \"去一趟\"}]}\n",
    "```\n",
    "\n",
    "## 步骤：\n",
    "1. 转换 https://huggingface.co/datasets/shibing624/CSC 数据集格式，为标准格式，主要需要新增errors字段的内容；做法：用gpt-4o的api补充错误信息。\n",
    "2. 使用gpt-4o补充多字、少字错误，以及语法错误；扩充纠错数据集，提升多样性；做法：用few-shot学习的方式，基于self-instruct方法让gpt-4o生成新的纠错case。\n",
    "\n"
   ],
   "id": "ece6643c3a69f072"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## 下载csc的数据",
   "id": "5dee0dcab52647bc"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-22T09:55:26.731872Z",
     "start_time": "2024-08-22T09:55:12.755605Z"
    }
   },
   "cell_type": "code",
   "source": [
    "!wget https://huggingface.co/datasets/shibing624/CSC/resolve/main/train.json  -O train.json\n",
    "!wget https://huggingface.co/datasets/shibing624/CSC/resolve/main/dev.json  -O dev.json\n",
    "!wget https://huggingface.co/datasets/shibing624/CSC/resolve/main/test.json -O test.json"
   ],
   "id": "b4e415221fe69005",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--2024-08-22 17:55:12--  https://huggingface.co/datasets/shibing624/CSC/resolve/main/train.json\r\n",
      "Resolving huggingface.co (huggingface.co)... 202.160.130.145\r\n",
      "Connecting to huggingface.co (huggingface.co)|202.160.130.145|:443... connected.\r\n",
      "HTTP request sent, awaiting response... 302 Found\r\n",
      "Location: https://cdn-lfs.huggingface.co/repos/08/a5/08a550bb5aca91891713cf90cfa7f433f1e9eb5393993a908fca51d7831f42bf/4d947b7c6de671783c9809e90ceeca5142dc716914b06d2f31d0ba3f1eef0dd4?response-content-disposition=inline%3B+filename*%3DUTF-8%27%27train.json%3B+filename%3D%22train.json%22%3B&response-content-type=application%2Fjson&Expires=1724579713&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcyNDU3OTcxM319LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wOC9hNS8wOGE1NTBiYjVhY2E5MTg5MTcxM2NmOTBjZmE3ZjQzM2YxZTllYjUzOTM5OTNhOTA4ZmNhNTFkNzgzMWY0MmJmLzRkOTQ3YjdjNmRlNjcxNzgzYzk4MDllOTBjZWVjYTUxNDJkYzcxNjkxNGIwNmQyZjMxZDBiYTNmMWVlZjBkZDQ%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qJnJlc3BvbnNlLWNvbnRlbnQtdHlwZT0qIn1dfQ__&Signature=QfSwwUDLV6x7RLexz1P1fP6x1u-O8Zcy%7Ekx9cvfP3LJHKe6cy-%7E1rU7LwluhtgIXkr1dnZGp7mbG0GZT8ZVE0DIu2Vnhm3fEd3DPQ-wHoILWEMVJTjjheRLy-XHbO3GEPDqWKsMfNhNFiXsBno0gtxZEakBdrF3VxLLwnC9rR%7E0YCH8eJxpzfrAo36th9MzABYLF0wUr%7EmJwp9Ncz-gJQM7AhnLZE5bYl6o7C89n%7ErponDFhE04Rig2pD%7E-xeEUCzXfY-TLiqqYHa4f3uXbYqv3SDy0%7EZixMGjHJT3gE-W1a84zT6gLiusQj0dPGyV7iUr3Xm7GNtd2wCluYV1bgrw__&Key-Pair-Id=K3ESJI6DHPFC7 [following]\r\n",
      "--2024-08-22 17:55:13--  https://cdn-lfs.huggingface.co/repos/08/a5/08a550bb5aca91891713cf90cfa7f433f1e9eb5393993a908fca51d7831f42bf/4d947b7c6de671783c9809e90ceeca5142dc716914b06d2f31d0ba3f1eef0dd4?response-content-disposition=inline%3B+filename*%3DUTF-8%27%27train.json%3B+filename%3D%22train.json%22%3B&response-content-type=application%2Fjson&Expires=1724579713&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcyNDU3OTcxM319LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wOC9hNS8wOGE1NTBiYjVhY2E5MTg5MTcxM2NmOTBjZmE3ZjQzM2YxZTllYjUzOTM5OTNhOTA4ZmNhNTFkNzgzMWY0MmJmLzRkOTQ3YjdjNmRlNjcxNzgzYzk4MDllOTBjZWVjYTUxNDJkYzcxNjkxNGIwNmQyZjMxZDBiYTNmMWVlZjBkZDQ%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qJnJlc3BvbnNlLWNvbnRlbnQtdHlwZT0qIn1dfQ__&Signature=QfSwwUDLV6x7RLexz1P1fP6x1u-O8Zcy%7Ekx9cvfP3LJHKe6cy-%7E1rU7LwluhtgIXkr1dnZGp7mbG0GZT8ZVE0DIu2Vnhm3fEd3DPQ-wHoILWEMVJTjjheRLy-XHbO3GEPDqWKsMfNhNFiXsBno0gtxZEakBdrF3VxLLwnC9rR%7E0YCH8eJxpzfrAo36th9MzABYLF0wUr%7EmJwp9Ncz-gJQM7AhnLZE5bYl6o7C89n%7ErponDFhE04Rig2pD%7E-xeEUCzXfY-TLiqqYHa4f3uXbYqv3SDy0%7EZixMGjHJT3gE-W1a84zT6gLiusQj0dPGyV7iUr3Xm7GNtd2wCluYV1bgrw__&Key-Pair-Id=K3ESJI6DHPFC7\r\n",
      "Resolving cdn-lfs.huggingface.co (cdn-lfs.huggingface.co)... 31.13.69.169\r\n",
      "Connecting to cdn-lfs.huggingface.co (cdn-lfs.huggingface.co)|31.13.69.169|:443... connected.\r\n",
      "HTTP request sent, awaiting response... 200 OK\r\n",
      "Length: 99038414 (94M) [application/json]\r\n",
      "Saving to: ‘train.json’\r\n",
      "\r\n",
      "train.json          100%[===================>]  94.45M  9.90MB/s    in 10s     \r\n",
      "\r\n",
      "2024-08-22 17:55:23 (9.49 MB/s) - ‘train.json’ saved [99038414/99038414]\r\n",
      "\r\n",
      "--2024-08-22 17:55:23--  https://huggingface.co/datasets/shibing624/CSC/resolve/main/dev.json\r\n",
      "Resolving huggingface.co (huggingface.co)... 202.160.130.145\r\n",
      "Connecting to huggingface.co (huggingface.co)|202.160.130.145|:443... connected.\r\n",
      "HTTP request sent, awaiting response... 302 Found\r\n",
      "Location: https://cdn-lfs.huggingface.co/repos/08/a5/08a550bb5aca91891713cf90cfa7f433f1e9eb5393993a908fca51d7831f42bf/8a10ba42f111bfd7dff7482b39e97146da5ca890a40e9c3de8622cd5cc4be35c?response-content-disposition=inline%3B+filename*%3DUTF-8%27%27dev.json%3B+filename%3D%22dev.json%22%3B&response-content-type=application%2Fjson&Expires=1724579724&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcyNDU3OTcyNH19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wOC9hNS8wOGE1NTBiYjVhY2E5MTg5MTcxM2NmOTBjZmE3ZjQzM2YxZTllYjUzOTM5OTNhOTA4ZmNhNTFkNzgzMWY0MmJmLzhhMTBiYTQyZjExMWJmZDdkZmY3NDgyYjM5ZTk3MTQ2ZGE1Y2E4OTBhNDBlOWMzZGU4NjIyY2Q1Y2M0YmUzNWM%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qJnJlc3BvbnNlLWNvbnRlbnQtdHlwZT0qIn1dfQ__&Signature=MqrgDUz5ZtBK6EuqmK%7ETq%7EwjLhcGL-rTUez3slTE8VlAml-jKg1KzDCNzHv2uiNC8n6cuoEf97Ey0oUkVQgdHPc6wQQUJBaVElECc7xjEELgCvb6gn4kX6Bt7fRpj4mq2BJpwcy3GG%7EoSCIGpoWxS8lvywG1wws8EEopzEAFcnywC1jOMRyEdt6MImU6BCFOkXt45Hbv4bemtgoZvJotqkpiGfGYoODxQzJ5daS6T%7EAw4UQv8ctHC8uqWj8fUAN9GfqsQcj%7E-bvB80lbyEQwAI7w9QSaUm3G7slRgRajJH0gvoOR8nSbPOiu6BL9sdXI5m0R-92deC%7ERxUArw7LK2A__&Key-Pair-Id=K3ESJI6DHPFC7 [following]\r\n",
      "--2024-08-22 17:55:24--  https://cdn-lfs.huggingface.co/repos/08/a5/08a550bb5aca91891713cf90cfa7f433f1e9eb5393993a908fca51d7831f42bf/8a10ba42f111bfd7dff7482b39e97146da5ca890a40e9c3de8622cd5cc4be35c?response-content-disposition=inline%3B+filename*%3DUTF-8%27%27dev.json%3B+filename%3D%22dev.json%22%3B&response-content-type=application%2Fjson&Expires=1724579724&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcyNDU3OTcyNH19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wOC9hNS8wOGE1NTBiYjVhY2E5MTg5MTcxM2NmOTBjZmE3ZjQzM2YxZTllYjUzOTM5OTNhOTA4ZmNhNTFkNzgzMWY0MmJmLzhhMTBiYTQyZjExMWJmZDdkZmY3NDgyYjM5ZTk3MTQ2ZGE1Y2E4OTBhNDBlOWMzZGU4NjIyY2Q1Y2M0YmUzNWM%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qJnJlc3BvbnNlLWNvbnRlbnQtdHlwZT0qIn1dfQ__&Signature=MqrgDUz5ZtBK6EuqmK%7ETq%7EwjLhcGL-rTUez3slTE8VlAml-jKg1KzDCNzHv2uiNC8n6cuoEf97Ey0oUkVQgdHPc6wQQUJBaVElECc7xjEELgCvb6gn4kX6Bt7fRpj4mq2BJpwcy3GG%7EoSCIGpoWxS8lvywG1wws8EEopzEAFcnywC1jOMRyEdt6MImU6BCFOkXt45Hbv4bemtgoZvJotqkpiGfGYoODxQzJ5daS6T%7EAw4UQv8ctHC8uqWj8fUAN9GfqsQcj%7E-bvB80lbyEQwAI7w9QSaUm3G7slRgRajJH0gvoOR8nSbPOiu6BL9sdXI5m0R-92deC%7ERxUArw7LK2A__&Key-Pair-Id=K3ESJI6DHPFC7\r\n",
      "Resolving cdn-lfs.huggingface.co (cdn-lfs.huggingface.co)... 31.13.69.169\r\n",
      "Connecting to cdn-lfs.huggingface.co (cdn-lfs.huggingface.co)|31.13.69.169|:443... connected.\r\n",
      "HTTP request sent, awaiting response... 200 OK\r\n",
      "Length: 11057130 (11M) [application/json]\r\n",
      "Saving to: ‘dev.json’\r\n",
      "\r\n",
      "dev.json            100%[===================>]  10.54M  10.8MB/s    in 1.0s    \r\n",
      "\r\n",
      "2024-08-22 17:55:25 (10.8 MB/s) - ‘dev.json’ saved [11057130/11057130]\r\n",
      "\r\n",
      "--2024-08-22 17:55:25--  https://huggingface.co/datasets/shibing624/CSC/resolve/main/test.json\r\n",
      "Resolving huggingface.co (huggingface.co)... 202.160.130.145\r\n",
      "Connecting to huggingface.co (huggingface.co)|202.160.130.145|:443... connected.\r\n",
      "HTTP request sent, awaiting response... 200 OK\r\n",
      "Length: 346770 (339K) [text/plain]\r\n",
      "Saving to: ‘test.json’\r\n",
      "\r\n",
      "test.json           100%[===================>] 338.64K   990KB/s    in 0.3s    \r\n",
      "\r\n",
      "2024-08-22 17:55:26 (990 KB/s) - ‘test.json’ saved [346770/346770]\r\n",
      "\r\n"
     ]
    }
   ],
   "execution_count": 1
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-22T09:55:27.545046Z",
     "start_time": "2024-08-22T09:55:26.734101Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import json\n",
    "import random\n",
    "import pandas as pd\n",
    "\n",
    "def load_json(file_path):\n",
    "    with open(file_path) as f:\n",
    "        ds = json.load(f)\n",
    "    return ds\n",
    "ds1 = load_json('train.json')\n",
    "# get random 2000 samples\n",
    "ds1 = random.sample(ds1, 2000)\n",
    "print('ds1 size:',len(ds1))\n",
    "ds2 = load_json('dev.json')\n",
    "ds2 = random.sample(ds2, 2000)\n",
    "print('ds2 size:',len(ds2))\n",
    "ds3 = load_json('test.json')\n",
    "print('ds3 size:',len(ds3))\n",
    "ds = ds1 + ds2 + ds3\n",
    "\n",
    "\n",
    "ds[:3], len(ds)"
   ],
   "id": "fa417a8de0fb0cf3",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ds1 size: 2000\n",
      "ds2 size: 2000\n",
      "ds3 size: 1100\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([{'id': '-',\n",
       "   'original_text': '今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式谋杀的现象，表示唯有藉君提升妇女的社会地位，才能与之对抗。',\n",
       "   'wrong_ids': [57],\n",
       "   'correct_text': '今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式谋杀的现象，表示唯有藉着提升妇女的社会地位，才能与之对抗。'},\n",
       "  {'id': '-',\n",
       "   'original_text': '根据三年前签署的全球暖化问题京都议定书，福有国家保证减少造成温室效应的气体排放量这些气体包括二氧化碳与燃烧石油、煤、天然气等产生的其他副产品。',\n",
       "   'wrong_ids': [20],\n",
       "   'correct_text': '根据三年前签署的全球暖化问题京都议定书，富有国家保证减少造成温室效应的气体排放量这些气体包括二氧化碳与燃烧石油、煤、天然气等产生的其他副产品。'},\n",
       "  {'id': '-',\n",
       "   'original_text': '据报导，美国战机自二十曰起即在硫磺岛举行军事演习。',\n",
       "   'wrong_ids': [11],\n",
       "   'correct_text': '据报导，美国战机自二十日起即在硫磺岛举行军事演习。'}],\n",
       " 5100)"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 2
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "### 只取有错误的数据，才需要处理，并去重",
   "id": "b54dc7e88e59051c"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-22T09:55:27.549136Z",
     "start_time": "2024-08-22T09:55:27.545780Z"
    }
   },
   "cell_type": "code",
   "source": [
    "error_ds = [i for i in ds if len(i['wrong_ids']) > 0]\n",
    "error_ds[:3], len(error_ds)"
   ],
   "id": "8a894632ba0458ad",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([{'id': '-',\n",
       "   'original_text': '今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式谋杀的现象，表示唯有藉君提升妇女的社会地位，才能与之对抗。',\n",
       "   'wrong_ids': [57],\n",
       "   'correct_text': '今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式谋杀的现象，表示唯有藉着提升妇女的社会地位，才能与之对抗。'},\n",
       "  {'id': '-',\n",
       "   'original_text': '根据三年前签署的全球暖化问题京都议定书，福有国家保证减少造成温室效应的气体排放量这些气体包括二氧化碳与燃烧石油、煤、天然气等产生的其他副产品。',\n",
       "   'wrong_ids': [20],\n",
       "   'correct_text': '根据三年前签署的全球暖化问题京都议定书，富有国家保证减少造成温室效应的气体排放量这些气体包括二氧化碳与燃烧石油、煤、天然气等产生的其他副产品。'},\n",
       "  {'id': '-',\n",
       "   'original_text': '据报导，美国战机自二十曰起即在硫磺岛举行军事演习。',\n",
       "   'wrong_ids': [11],\n",
       "   'correct_text': '据报导，美国战机自二十日起即在硫磺岛举行军事演习。'}],\n",
       " 4515)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 3
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-22T09:55:27.555404Z",
     "start_time": "2024-08-22T09:55:27.549822Z"
    }
   },
   "cell_type": "code",
   "source": [
    "input_ds = []\n",
    "temp = set()\n",
    "for i in error_ds:\n",
    "    origin_text = i['original_text']\n",
    "    if origin_text not in temp:\n",
    "        # 原始correct_text可能有错误，让gpt-4o来生成\n",
    "        i['correct_text'] = ''\n",
    "        i['wrong_ids'] = []\n",
    "        input_ds.append(i)\n",
    "    temp.add(origin_text)\n",
    "    \n",
    "input_ds[:3], len(input_ds)"
   ],
   "id": "193f314560b31970",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([{'id': '-',\n",
       "   'original_text': '今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式谋杀的现象，表示唯有藉君提升妇女的社会地位，才能与之对抗。',\n",
       "   'wrong_ids': [],\n",
       "   'correct_text': ''},\n",
       "  {'id': '-',\n",
       "   'original_text': '根据三年前签署的全球暖化问题京都议定书，福有国家保证减少造成温室效应的气体排放量这些气体包括二氧化碳与燃烧石油、煤、天然气等产生的其他副产品。',\n",
       "   'wrong_ids': [],\n",
       "   'correct_text': ''},\n",
       "  {'id': '-',\n",
       "   'original_text': '据报导，美国战机自二十曰起即在硫磺岛举行军事演习。',\n",
       "   'wrong_ids': [],\n",
       "   'correct_text': ''}],\n",
       " 4514)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 4
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## gpt-4o api",
   "id": "89791bd41a4af252"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-22T09:55:30.052864Z",
     "start_time": "2024-08-22T09:55:27.556767Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import os\n",
    "from openai import AzureOpenAI\n",
    "from dotenv import load_dotenv\n",
    "load_dotenv()\n",
    "\n",
    "AZURE_OPENAI_API_KEY = os.environ.get(\"AZURE_OPENAI_API_KEY\")\n",
    "print(AZURE_OPENAI_API_KEY)\n",
    "\n",
    "azclient = AzureOpenAI(\n",
    "    api_key=AZURE_OPENAI_API_KEY, \n",
    "    azure_endpoint=\"https://completions-gpt-v2.openai.azure.com\",\n",
    "    api_version=\"2024-02-01\",\n",
    ")\n",
    "print(azclient)\n",
    "\n",
    "def request_gpt4o_azure(prompt):\n",
    "    try:\n",
    "        r = azclient.chat.completions.create(\n",
    "            model=\"gpt-4o\",\n",
    "            messages=[{\"role\": \"user\", \"content\": prompt}],\n",
    "        )\n",
    "        return r.choices[0].message.content\n",
    "    except Exception as e:\n",
    "        print(e)\n",
    "        return \"\"\n",
    "\n",
    "r = request_gpt4o_azure('为什么我没有被邀请参加父母的婚礼?，一句话回答')\n",
    "print(r)"
   ],
   "id": "53ef70b7a02df8f3",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "297ece6f50c941d39e315bd76c108587\n",
      "<openai.lib.azure.AzureOpenAI object at 0x12d593c10>\n",
      "你可能还没有出生吧。\n"
     ]
    }
   ],
   "execution_count": 5
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "## 步骤1. 转换 https://huggingface.co/datasets/shibing624/CSC 数据集格式，为标准格式，主要需要新增errors字段的内容；做法：用gpt-4o的api补充错误信息。\n",
    "\n",
    "注意:\n",
    "\n",
    "- 1.结合gpt模型的推理过程，先输出errors信息，再输出correct_text信息。\n",
    "- 2.gpt模型对index位置不擅长，所以不需要输出index信息。\n",
    "- 3.输出的jsonl格式，需要符合标准格式。\n"
   ],
   "id": "4423904fce24aa02"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-22T09:55:31.824107Z",
     "start_time": "2024-08-22T09:55:30.055242Z"
    }
   },
   "cell_type": "code",
   "source": [
    "def correct_ds(sentence):\n",
    "    prompt = \"\"\"\n",
    "你帮我处理中文纠错训练集，标准纠错样本格式如下（jsonl格式）：\n",
    "\n",
    "```\n",
    "{\"id\": \"A2-0011-1\",\"original_text\": \"你好！我是张爱文。\",\"errors\":[],\"correct_text\": \"你好！我是张爱文。\"}\n",
    "{\"id\": \"A2-0023-1\",\"original_text\": \"下个星期，我跟我朋唷打算去法国玩儿。\",\"errors\":[{\"original_error\": \"朋唷\",\"type\": \"spelling_error\",\"correct\": \"朋友\"}],\"correct_text\": \"下个星期，我跟我朋友打算去法国玩儿。\"}\n",
    "{\"id\": \"A2-0029-1\",\"original_text\": \"对不气，最近我很忙，所以我不会去妳的。\",\"errors\":[{\"original_error\": \"不气\",\"type\": \"spelling_error\",\"correct\": \"不起\"},{\"original_error\": \"妳的\",\"type\": \"grammar_error\",\"correct\": \"你的\"}],\"correct_text\": \"对不起，最近我很忙，所以我不会去你的。\"}\n",
    "{\"id\": \"A2-0031-1\",\"original_text\": \"他昨天去了图书馆借了很多书籍。\",\"errors\":[{\"original_error\": \"书籍\",\"type\": \"extra_word\",\"correct\": \"书\"}],\"correct_text\": \"他昨天去了图书馆借了很多书。\"}\n",
    "{\"id\": \"A2-0032-1\",\"original_text\": \"今天我得去趟超市买牛奶。\",\"errors\":[{\"original_error\": \"去趟\",\"type\": \"missing_word\",\"correct\": \"去一趟\"}],\"correct_text\": \"今天我得去一趟超市买牛奶。\"}\n",
    "```\n",
    "\n",
    "说明：\n",
    "- id：样本id，标识而已，可为空。\n",
    "- original_text，原始文本：输入的原始文本。\n",
    "- errors，错误列表：使用 errors 数组来列出每个错误，包括原始错误文本片段（original_error）、错误类型（type）和正确的文本（correct）。这有助于模型更精确地理解错误。\n",
    "- type，错误类型：定义4种常见的错误类型，例如 spelling_error（拼写错误）、grammar_error（语法错误）、missing_word（缺少单词）、extra_word（多余单词）等。\n",
    "- correct_text，正确文本：正确的文本，即纠正后的文本。\n",
    "\n",
    "要求：\n",
    "1.只按标准纠错样本格式输出处理后的jsonl结果，不需要解释。\n",
    "2.请确保输出的jsonl格式正确，以便后续处理。\n",
    "3.errors是个列表，如果有多个错误，就都写入；如果没有错误，就是空列表。\n",
    "\n",
    "请帮我处理下面的句子：\n",
    "{sentence}\n",
    "    \"\"\"\n",
    "\n",
    "    try:\n",
    "        res = request_gpt4o_azure(prompt.replace(\"{sentence}\", sentence))\n",
    "    except Exception as e:\n",
    "        print(e)\n",
    "        res = \"\"\n",
    "    \n",
    "    # 返回结果，处理\n",
    "    clean_res = ''\n",
    "    try:\n",
    "        if res:\n",
    "            res = res.strip()\n",
    "            lines = res.split(\"\\n\")\n",
    "            for i in lines:\n",
    "                if i.startswith(\"```\"):\n",
    "                    continue\n",
    "                if i.startswith(\"{\"):\n",
    "                    clean_res = i\n",
    "                    break\n",
    "            clean_res = json.loads(clean_res)\n",
    "    except Exception as e:\n",
    "        print(e)\n",
    "    origin_res = res\n",
    "    return origin_res, clean_res\n",
    "\n",
    "# 示例问题和回答\n",
    "q = \"\"\"\n",
    "{'id': '-',\n",
    "   'original_text': '对不气，最近我很忙，所以我不会去妳的。',\n",
    "   'wrong_ids': [],\n",
    "   'correct_text': ''}\n",
    "\"\"\"\n",
    "\n",
    "# 发送请求并获取评估\n",
    "origin_res, r = correct_ds(q)\n",
    "origin_res, r"
   ],
   "id": "a0905e8ce2ccf93d",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "('```\\n{\"id\": \"-\",\"original_text\": \"对不气，最近我很忙，所以我不会去妳的。\",\"errors\":[{\"original_error\": \"不气\",\"type\": \"spelling_error\",\"correct\": \"不起\"},{\"original_error\": \"妳的\",\"type\": \"grammar_error\",\"correct\": \"你的\"}],\"correct_text\": \"对不起，最近我很忙，所以我不会去你的。\"}\\n```',\n",
       " {'id': '-',\n",
       "  'original_text': '对不气，最近我很忙，所以我不会去妳的。',\n",
       "  'errors': [{'original_error': '不气',\n",
       "    'type': 'spelling_error',\n",
       "    'correct': '不起'},\n",
       "   {'original_error': '妳的', 'type': 'grammar_error', 'correct': '你的'}],\n",
       "  'correct_text': '对不起，最近我很忙，所以我不会去你的。'})"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 6
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## 批量处理",
   "id": "41c0cbe60463c0fe"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-22T15:45:48.567972Z",
     "start_time": "2024-08-22T09:55:31.826411Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from tqdm import tqdm\n",
    "# 初始化一个空的DataFrame，用于存储预测结果\n",
    "df = pd.DataFrame(columns=['id', 'original_text', 'errors', 'correct_text'])\n",
    "output_file_path_temp = 'csc_gpt4o.csv'\n",
    "output_file_path = 'csc_gpt4o.xlsx'\n",
    "# 遍历query_list中的每个问题\n",
    "for idx, q in enumerate(tqdm(input_ds[:], desc=\"Processing\")):\n",
    "    origin_res, r = correct_ds(str(q))\n",
    "    if r:\n",
    "        if idx < 10:\n",
    "            print(idx, q, origin_res, r)\n",
    "\n",
    "        new_df = pd.DataFrame([r])\n",
    "        df = pd.concat([df, new_df], ignore_index=True)\n",
    "\n",
    "        if idx > 1 and idx % 500 == 0:\n",
    "            df.to_csv(output_file_path_temp, index=False)\n",
    "\n",
    "df.to_csv(output_file_path_temp, index=False)\n",
    "df.to_excel(output_file_path, index=False)"
   ],
   "id": "9e5933e883cb0769",
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:   0%|          | 1/4514 [00:02<3:42:12,  2.95s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 {'id': '-', 'original_text': '今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式谋杀的现象，表示唯有藉君提升妇女的社会地位，才能与之对抗。', 'wrong_ids': [], 'correct_text': ''} ```\n",
      "{\"id\": \"-\",\"original_text\": \"今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式谋杀的现象，表示唯有藉君提升妇女的社会地位，才能与之对抗。\",\"errors\":[{\"original_error\": \"藉君\",\"type\": \"spelling_error\",\"correct\": \"提升\"}],\"correct_text\": \"今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式谋杀的现象，表示唯有提升妇女的社会地位，才能与之对抗。\"}\n",
      "``` {'id': '-', 'original_text': '今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式谋杀的现象，表示唯有藉君提升妇女的社会地位，才能与之对抗。', 'errors': [{'original_error': '藉君', 'type': 'spelling_error', 'correct': '提升'}], 'correct_text': '今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式谋杀的现象，表示唯有提升妇女的社会地位，才能与之对抗。'}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:   0%|          | 2/4514 [00:07<4:36:31,  3.68s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 {'id': '-', 'original_text': '根据三年前签署的全球暖化问题京都议定书，福有国家保证减少造成温室效应的气体排放量这些气体包括二氧化碳与燃烧石油、煤、天然气等产生的其他副产品。', 'wrong_ids': [], 'correct_text': ''} ```\n",
      "{\"id\": \"-\",\"original_text\": \"根据三年前签署的全球暖化问题京都议定书，福有国家保证减少造成温室效应的气体排放量这些气体包括二氧化碳与燃烧石油、煤、天然气等产生的其他副产品。\",\"errors\":[{\"original_error\": \"福有国家\",\"type\": \"spelling_error\",\"correct\": \"富有国家\"},{\"original_error\": \"排放量这些气体包括\",\"type\": \"missing_punctuation\",\"correct\": \"排放量。这些气体包括\"}],\"correct_text\": \"根据三年前签署的全球暖化问题京都议定书，富有国家保证减少造成温室效应的气体排放量。这些气体包括二氧化碳与燃烧石油、煤、天然气等产生的其他副产品。\"}\n",
      "``` {'id': '-', 'original_text': '根据三年前签署的全球暖化问题京都议定书，福有国家保证减少造成温室效应的气体排放量这些气体包括二氧化碳与燃烧石油、煤、天然气等产生的其他副产品。', 'errors': [{'original_error': '福有国家', 'type': 'spelling_error', 'correct': '富有国家'}, {'original_error': '排放量这些气体包括', 'type': 'missing_punctuation', 'correct': '排放量。这些气体包括'}], 'correct_text': '根据三年前签署的全球暖化问题京都议定书，富有国家保证减少造成温室效应的气体排放量。这些气体包括二氧化碳与燃烧石油、煤、天然气等产生的其他副产品。'}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:   0%|          | 3/4514 [00:10<4:36:49,  3.68s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2 {'id': '-', 'original_text': '据报导，美国战机自二十曰起即在硫磺岛举行军事演习。', 'wrong_ids': [], 'correct_text': ''} ```json\n",
      "{\"id\": \"-\",\"original_text\": \"据报导，美国战机自二十曰起即在硫磺岛举行军事演习。\",\"errors\":[{\"original_error\": \"曰\",\"type\": \"spelling_error\",\"correct\": \"日\"}],\"correct_text\": \"据报导，美国战机自二十日起即在硫磺岛举行军事演习。\"}\n",
      "``` {'id': '-', 'original_text': '据报导，美国战机自二十曰起即在硫磺岛举行军事演习。', 'errors': [{'original_error': '曰', 'type': 'spelling_error', 'correct': '日'}], 'correct_text': '据报导，美国战机自二十日起即在硫磺岛举行军事演习。'}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:   0%|          | 4/4514 [00:14<4:33:03,  3.63s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3 {'id': '-', 'original_text': '目击者称，以军已把封锁路障除去，不过备关卡检查站仍有坦克派驻，车辆已能来往通过，只是流量很漫。', 'wrong_ids': [], 'correct_text': ''} ```json\n",
      "{\"id\": \"-\",\"original_text\": \"目击者称，以军已把封锁路障除去，不过备关卡检查站仍有坦克派驻，车辆已能来往通过，只是流量很漫。\",\"errors\":[{\"original_error\": \"备\",\"type\": \"spelling_error\",\"correct\": \"各\"},{\"original_error\": \"漫\",\"type\": \"spelling_error\",\"correct\": \"慢\"}],\"correct_text\": \"目击者称，以军已把封锁路障除去，不过各关卡检查站仍有坦克派驻，车辆已能来往通过，只是流量很慢。\"}\n",
      "``` {'id': '-', 'original_text': '目击者称，以军已把封锁路障除去，不过备关卡检查站仍有坦克派驻，车辆已能来往通过，只是流量很漫。', 'errors': [{'original_error': '备', 'type': 'spelling_error', 'correct': '各'}, {'original_error': '漫', 'type': 'spelling_error', 'correct': '慢'}], 'correct_text': '目击者称，以军已把封锁路障除去，不过各关卡检查站仍有坦克派驻，车辆已能来往通过，只是流量很慢。'}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:   0%|          | 5/4514 [00:18<4:57:46,  3.96s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4 {'id': '-', 'original_text': '华盛顿时撮同时报导，华府计划在一年内将驻在南韩首都汉城美军总部的七千多名人员，大部分移往他处。', 'wrong_ids': [], 'correct_text': ''} ```\n",
      "{\"id\": \"-\",\"original_text\": \"华盛顿时撮同时报导，华府计划在一年内将驻在南韩首都汉城美军总部的七千多名人员，大部分移往他处。\",\"errors\":[{\"original_error\": \"时撮\",\"type\": \"spelling_error\",\"correct\": \"时报\"},{\"original_error\": \"南韩\",\"type\": \"spelling_error\",\"correct\": \"韩国\"},{\"original_error\": \"汉城\",\"type\": \"spelling_error\",\"correct\": \"首尔\"}],\"correct_text\": \"华盛顿时报同时报导，华府计划在一年内将驻在韩国首都首尔美军总部的七千多名人员，大部分移往他处。\"}\n",
      "``` {'id': '-', 'original_text': '华盛顿时撮同时报导，华府计划在一年内将驻在南韩首都汉城美军总部的七千多名人员，大部分移往他处。', 'errors': [{'original_error': '时撮', 'type': 'spelling_error', 'correct': '时报'}, {'original_error': '南韩', 'type': 'spelling_error', 'correct': '韩国'}, {'original_error': '汉城', 'type': 'spelling_error', 'correct': '首尔'}], 'correct_text': '华盛顿时报同时报导，华府计划在一年内将驻在韩国首都首尔美军总部的七千多名人员，大部分移往他处。'}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:   0%|          | 6/4514 [00:21<4:30:11,  3.60s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5 {'id': '-', 'original_text': '温州城官协管员张国女清洁工被停职。', 'wrong_ids': [], 'correct_text': ''} ```\n",
      "{\"id\": \"-\",\"original_text\": \"温州城官协管员张国女清洁工被停职。\",\"errors\":[{\"original_error\": \"张国女清洁工\",\"type\": \"grammar_error\",\"correct\": \"张国对女清洁工\"},{\"original_error\": \"温州城官\",\"type\": \"grammar_error\",\"correct\": \"温州城管\"}],\"correct_text\": \"温州城管协管员张国对女清洁工被停职。\"}\n",
      "``` {'id': '-', 'original_text': '温州城官协管员张国女清洁工被停职。', 'errors': [{'original_error': '张国女清洁工', 'type': 'grammar_error', 'correct': '张国对女清洁工'}, {'original_error': '温州城官', 'type': 'grammar_error', 'correct': '温州城管'}], 'correct_text': '温州城管协管员张国对女清洁工被停职。'}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:   0%|          | 7/4514 [00:24<4:19:42,  3.46s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "6 {'id': '-', 'original_text': '报导没有提供中毒事件的具体数字，但中国卫生部举办的一项调查显示，每年有数干人中毒，真中数百人丧生。', 'wrong_ids': [], 'correct_text': ''} ```json\n",
      "{\"id\": \"-\",\"original_text\": \"报导没有提供中毒事件的具体数字，但中国卫生部举办的一项调查显示，每年有数干人中毒，真中数百人丧生。\",\"errors\":[{\"original_error\": \"报导\",\"type\": \"spelling_error\",\"correct\": \"报道\"},{\"original_error\": \"数干\",\"type\": \"spelling_error\",\"correct\": \"数千\"},{\"original_error\": \"真中\",\"type\": \"spelling_error\",\"correct\": \"其中\"}],\"correct_text\": \"报道没有提供中毒事件的具体数字，但中国卫生部举办的一项调查显示，每年有数千人中毒，其中数百人丧生。\"}\n",
      "``` {'id': '-', 'original_text': '报导没有提供中毒事件的具体数字，但中国卫生部举办的一项调查显示，每年有数干人中毒，真中数百人丧生。', 'errors': [{'original_error': '报导', 'type': 'spelling_error', 'correct': '报道'}, {'original_error': '数干', 'type': 'spelling_error', 'correct': '数千'}, {'original_error': '真中', 'type': 'spelling_error', 'correct': '其中'}], 'correct_text': '报道没有提供中毒事件的具体数字，但中国卫生部举办的一项调查显示，每年有数千人中毒，其中数百人丧生。'}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:   0%|          | 8/4514 [00:27<3:48:39,  3.04s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "7 {'id': '-', 'original_text': '并且读者朋友将一如继往同我们携起手来。', 'wrong_ids': [], 'correct_text': ''} ```json\n",
      "{\"id\": \"-\",\"original_text\": \"并且读者朋友将一如继往同我们携起手来。\",\"errors\":[{\"original_error\": \"一如继往\",\"type\": \"spelling_error\",\"correct\": \"一如既往\"}],\"correct_text\": \"并且读者朋友将一如既往同我们携起手来。\"}\n",
      "``` {'id': '-', 'original_text': '并且读者朋友将一如继往同我们携起手来。', 'errors': [{'original_error': '一如继往', 'type': 'spelling_error', 'correct': '一如既往'}], 'correct_text': '并且读者朋友将一如既往同我们携起手来。'}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:   0%|          | 9/4514 [00:31<4:18:02,  3.44s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "8 {'id': '-', 'original_text': '加州宫员说，美国第二大烟草商雷诺兹公司，因为在杂志刊登香烟广告，非法试图诱引十二到十七岁的青少年吸烟，被圣地牙哥市法官判决课处二干万美元罚锾。', 'wrong_ids': [], 'correct_text': ''} ```\n",
      "{\"id\": \"-\",\"original_text\": \"加州宫员说，美国第二大烟草商雷诺兹公司，因为在杂志刊登香烟广告，非法试图诱引十二到十七岁的青少年吸烟，被圣地牙哥市法官判决课处二干万美元罚锾。\",\"errors\":[{\"original_error\": \"宫员\",\"type\": \"spelling_error\",\"correct\": \"官员\"},{\"original_error\": \"诱引\",\"type\": \"spelling_error\",\"correct\": \"诱引\"},{\"original_error\": \"圣地牙哥\",\"type\": \"spelling_error\",\"correct\": \"圣迭戈\"},{\"original_error\": \"二干万美元\",\"type\": \"spelling_error\",\"correct\": \"二千万美元\"}],\"correct_text\": \"加州官员说，美国第二大烟草商雷诺兹公司，因为在杂志刊登香烟广告，非法试图诱引十二到十七岁的青少年吸烟，被圣迭戈市法官判决课处二千万美元罚锾。\"}\n",
      "``` {'id': '-', 'original_text': '加州宫员说，美国第二大烟草商雷诺兹公司，因为在杂志刊登香烟广告，非法试图诱引十二到十七岁的青少年吸烟，被圣地牙哥市法官判决课处二干万美元罚锾。', 'errors': [{'original_error': '宫员', 'type': 'spelling_error', 'correct': '官员'}, {'original_error': '诱引', 'type': 'spelling_error', 'correct': '诱引'}, {'original_error': '圣地牙哥', 'type': 'spelling_error', 'correct': '圣迭戈'}, {'original_error': '二干万美元', 'type': 'spelling_error', 'correct': '二千万美元'}], 'correct_text': '加州官员说，美国第二大烟草商雷诺兹公司，因为在杂志刊登香烟广告，非法试图诱引十二到十七岁的青少年吸烟，被圣迭戈市法官判决课处二千万美元罚锾。'}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:   0%|          | 10/4514 [00:36<4:52:27,  3.90s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "9 {'id': '-', 'original_text': '佩尔索领先群雄有柜当距离，一马当先冲抵终点，但当他脸上带笑由池中爬起时，记分板上亮出他被取消了资格。', 'wrong_ids': [], 'correct_text': ''} ```json\n",
      "{\"id\": \"-\",\"original_text\": \"佩尔索领先群雄有柜当距离，一马当先冲抵终点，但当他脸上带笑由池中爬起时，记分板上亮出他被取消了资格。\",\"errors\":[{\"original_error\": \"柜当距离\",\"type\": \"spelling_error\",\"correct\": \"一段距离\"},{\"original_error\": \"由池中\",\"type\": \"spelling_error\",\"correct\": \"从池中\"}],\"correct_text\": \"佩尔索领先群雄有一段距离，一马当先冲抵终点，但当他脸上带笑从池中爬起时，记分板上亮出他被取消了资格。\"}\n",
      "``` {'id': '-', 'original_text': '佩尔索领先群雄有柜当距离，一马当先冲抵终点，但当他脸上带笑由池中爬起时，记分板上亮出他被取消了资格。', 'errors': [{'original_error': '柜当距离', 'type': 'spelling_error', 'correct': '一段距离'}, {'original_error': '由池中', 'type': 'spelling_error', 'correct': '从池中'}], 'correct_text': '佩尔索领先群雄有一段距离，一马当先冲抵终点，但当他脸上带笑从池中爬起时，记分板上亮出他被取消了资格。'}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:   2%|▏         | 96/4514 [05:51<4:08:45,  3.38s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:   4%|▍         | 177/4514 [10:18<3:53:58,  3.24s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:  10%|█         | 459/4514 [23:57<3:50:17,  3.41s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Expecting property name enclosed in double quotes: line 1 column 208 (char 207)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:  39%|███▉      | 1760/4514 [1:26:14<1:48:29,  2.36s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:  50%|█████     | 2259/4514 [1:54:46<1:27:50,  2.34s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:  86%|████████▋ | 3896/4514 [3:16:30<28:04,  2.73s/it]  "
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing: 100%|██████████| 4514/4514 [5:50:16<00:00,  4.66s/it]    \n"
     ]
    }
   ],
   "execution_count": 7
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-22T15:45:48.576647Z",
     "start_time": "2024-08-22T15:45:48.568852Z"
    }
   },
   "cell_type": "code",
   "source": "df",
   "id": "cb4bb9fbfb631dce",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "             id                                      original_text  \\\n",
       "0             -  今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式...   \n",
       "1             -  根据三年前签署的全球暖化问题京都议定书，福有国家保证减少造成温室效应的气体排放量这些气体包括...   \n",
       "2             -                          据报导，美国战机自二十曰起即在硫磺岛举行军事演习。   \n",
       "3             -    目击者称，以军已把封锁路障除去，不过备关卡检查站仍有坦克派驻，车辆已能来往通过，只是流量很漫。   \n",
       "4             -    华盛顿时撮同时报导，华府计划在一年内将驻在南韩首都汉城美军总部的七千多名人员，大部分移往他处。   \n",
       "...         ...                                                ...   \n",
       "4509  B2-4393-3                        整天都有人能检查你在家做甚么，有没有以政府说的去做事。   \n",
       "4510  B2-4396-2  但是我觉的学教有焋影机也好，如有发生意外老师们关查比交容易，不一定给家长在家有没有看到，还是...   \n",
       "4511  B2-4399-3                 然后，因为妈妈或爸爸一直看录音机，所以他们可以帮小孩子解决甚么问题。   \n",
       "4512  B2-4399-4                                         而且老师也很难教师。   \n",
       "4513  B2-4402-2                         这样学校及父母们都会知道也会有小朋友每天活动的挤入。   \n",
       "\n",
       "                                                 errors  \\\n",
       "0     [{'original_error': '藉君', 'type': 'spelling_er...   \n",
       "1     [{'original_error': '福有国家', 'type': 'spelling_...   \n",
       "2     [{'original_error': '曰', 'type': 'spelling_err...   \n",
       "3     [{'original_error': '备', 'type': 'spelling_err...   \n",
       "4     [{'original_error': '时撮', 'type': 'spelling_er...   \n",
       "...                                                 ...   \n",
       "4509  [{'original_error': '甚么', 'type': 'spelling_er...   \n",
       "4510  [{'original_error': '觉的', 'type': 'spelling_er...   \n",
       "4511  [{'original_error': '看录音机', 'type': 'word_choi...   \n",
       "4512  [{'original_error': '教师', 'type': 'grammar_err...   \n",
       "4513  [{'original_error': '挤入', 'type': 'grammar_err...   \n",
       "\n",
       "                                           correct_text    0  \n",
       "0     今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式...  NaN  \n",
       "1     根据三年前签署的全球暖化问题京都议定书，富有国家保证减少造成温室效应的气体排放量。这些气体包...  NaN  \n",
       "2                             据报导，美国战机自二十日起即在硫磺岛举行军事演习。  NaN  \n",
       "3       目击者称，以军已把封锁路障除去，不过各关卡检查站仍有坦克派驻，车辆已能来往通过，只是流量很慢。  NaN  \n",
       "4       华盛顿时报同时报导，华府计划在一年内将驻在韩国首都首尔美军总部的七千多名人员，大部分移往他处。  NaN  \n",
       "...                                                 ...  ...  \n",
       "4509                       整天都有人能检查你在家做什么，有没有按照政府说的去做事。  NaN  \n",
       "4510  但是我觉得学校有摄像机也好，如有发生意外老师们观察比较容易，不一定给家长在家有没有看到，还是...  NaN  \n",
       "4511                 然后，因为妈妈或爸爸一直听录音机，所以他们可以帮小孩子解决什么问题。  NaN  \n",
       "4512                                          而且老师也很难教。  NaN  \n",
       "4513                         这样学校及父母们都会知道也会有小朋友每天活动的记录。  NaN  \n",
       "\n",
       "[4514 rows x 5 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>original_text</th>\n",
       "      <th>errors</th>\n",
       "      <th>correct_text</th>\n",
       "      <th>0</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-</td>\n",
       "      <td>今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式...</td>\n",
       "      <td>[{'original_error': '藉君', 'type': 'spelling_er...</td>\n",
       "      <td>今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式...</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-</td>\n",
       "      <td>根据三年前签署的全球暖化问题京都议定书，福有国家保证减少造成温室效应的气体排放量这些气体包括...</td>\n",
       "      <td>[{'original_error': '福有国家', 'type': 'spelling_...</td>\n",
       "      <td>根据三年前签署的全球暖化问题京都议定书，富有国家保证减少造成温室效应的气体排放量。这些气体包...</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-</td>\n",
       "      <td>据报导，美国战机自二十曰起即在硫磺岛举行军事演习。</td>\n",
       "      <td>[{'original_error': '曰', 'type': 'spelling_err...</td>\n",
       "      <td>据报导，美国战机自二十日起即在硫磺岛举行军事演习。</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-</td>\n",
       "      <td>目击者称，以军已把封锁路障除去，不过备关卡检查站仍有坦克派驻，车辆已能来往通过，只是流量很漫。</td>\n",
       "      <td>[{'original_error': '备', 'type': 'spelling_err...</td>\n",
       "      <td>目击者称，以军已把封锁路障除去，不过各关卡检查站仍有坦克派驻，车辆已能来往通过，只是流量很慢。</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-</td>\n",
       "      <td>华盛顿时撮同时报导，华府计划在一年内将驻在南韩首都汉城美军总部的七千多名人员，大部分移往他处。</td>\n",
       "      <td>[{'original_error': '时撮', 'type': 'spelling_er...</td>\n",
       "      <td>华盛顿时报同时报导，华府计划在一年内将驻在韩国首都首尔美军总部的七千多名人员，大部分移往他处。</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4509</th>\n",
       "      <td>B2-4393-3</td>\n",
       "      <td>整天都有人能检查你在家做甚么，有没有以政府说的去做事。</td>\n",
       "      <td>[{'original_error': '甚么', 'type': 'spelling_er...</td>\n",
       "      <td>整天都有人能检查你在家做什么，有没有按照政府说的去做事。</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4510</th>\n",
       "      <td>B2-4396-2</td>\n",
       "      <td>但是我觉的学教有焋影机也好，如有发生意外老师们关查比交容易，不一定给家长在家有没有看到，还是...</td>\n",
       "      <td>[{'original_error': '觉的', 'type': 'spelling_er...</td>\n",
       "      <td>但是我觉得学校有摄像机也好，如有发生意外老师们观察比较容易，不一定给家长在家有没有看到，还是...</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4511</th>\n",
       "      <td>B2-4399-3</td>\n",
       "      <td>然后，因为妈妈或爸爸一直看录音机，所以他们可以帮小孩子解决甚么问题。</td>\n",
       "      <td>[{'original_error': '看录音机', 'type': 'word_choi...</td>\n",
       "      <td>然后，因为妈妈或爸爸一直听录音机，所以他们可以帮小孩子解决什么问题。</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4512</th>\n",
       "      <td>B2-4399-4</td>\n",
       "      <td>而且老师也很难教师。</td>\n",
       "      <td>[{'original_error': '教师', 'type': 'grammar_err...</td>\n",
       "      <td>而且老师也很难教。</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4513</th>\n",
       "      <td>B2-4402-2</td>\n",
       "      <td>这样学校及父母们都会知道也会有小朋友每天活动的挤入。</td>\n",
       "      <td>[{'original_error': '挤入', 'type': 'grammar_err...</td>\n",
       "      <td>这样学校及父母们都会知道也会有小朋友每天活动的记录。</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>4514 rows × 5 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 8
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-28T06:13:59.092651Z",
     "start_time": "2024-08-28T06:13:59.062949Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import pandas as pd\n",
    "df1 = pd.read_csv(\"csc_gpt4o.csv\")\n",
    "df1"
   ],
   "id": "b045747882f59914",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "             id                                      original_text  \\\n",
       "0             -  今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式...   \n",
       "1             -  根据三年前签署的全球暖化问题京都议定书，福有国家保证减少造成温室效应的气体排放量这些气体包括...   \n",
       "2             -                          据报导，美国战机自二十曰起即在硫磺岛举行军事演习。   \n",
       "3             -    目击者称，以军已把封锁路障除去，不过备关卡检查站仍有坦克派驻，车辆已能来往通过，只是流量很漫。   \n",
       "4             -    华盛顿时撮同时报导，华府计划在一年内将驻在南韩首都汉城美军总部的七千多名人员，大部分移往他处。   \n",
       "...         ...                                                ...   \n",
       "4509  B2-4393-3                        整天都有人能检查你在家做甚么，有没有以政府说的去做事。   \n",
       "4510  B2-4396-2  但是我觉的学教有焋影机也好，如有发生意外老师们关查比交容易，不一定给家长在家有没有看到，还是...   \n",
       "4511  B2-4399-3                 然后，因为妈妈或爸爸一直看录音机，所以他们可以帮小孩子解决甚么问题。   \n",
       "4512  B2-4399-4                                         而且老师也很难教师。   \n",
       "4513  B2-4402-2                         这样学校及父母们都会知道也会有小朋友每天活动的挤入。   \n",
       "\n",
       "                                                 errors  \\\n",
       "0     [{'original_error': '藉君', 'type': 'spelling_er...   \n",
       "1     [{'original_error': '福有国家', 'type': 'spelling_...   \n",
       "2     [{'original_error': '曰', 'type': 'spelling_err...   \n",
       "3     [{'original_error': '备', 'type': 'spelling_err...   \n",
       "4     [{'original_error': '时撮', 'type': 'spelling_er...   \n",
       "...                                                 ...   \n",
       "4509  [{'original_error': '甚么', 'type': 'spelling_er...   \n",
       "4510  [{'original_error': '觉的', 'type': 'spelling_er...   \n",
       "4511  [{'original_error': '看录音机', 'type': 'word_choi...   \n",
       "4512  [{'original_error': '教师', 'type': 'grammar_err...   \n",
       "4513  [{'original_error': '挤入', 'type': 'grammar_err...   \n",
       "\n",
       "                                           correct_text    0  \n",
       "0     今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式...  NaN  \n",
       "1     根据三年前签署的全球暖化问题京都议定书，富有国家保证减少造成温室效应的气体排放量。这些气体包...  NaN  \n",
       "2                             据报导，美国战机自二十日起即在硫磺岛举行军事演习。  NaN  \n",
       "3       目击者称，以军已把封锁路障除去，不过各关卡检查站仍有坦克派驻，车辆已能来往通过，只是流量很慢。  NaN  \n",
       "4       华盛顿时报同时报导，华府计划在一年内将驻在韩国首都首尔美军总部的七千多名人员，大部分移往他处。  NaN  \n",
       "...                                                 ...  ...  \n",
       "4509                       整天都有人能检查你在家做什么，有没有按照政府说的去做事。  NaN  \n",
       "4510  但是我觉得学校有摄像机也好，如有发生意外老师们观察比较容易，不一定给家长在家有没有看到，还是...  NaN  \n",
       "4511                 然后，因为妈妈或爸爸一直听录音机，所以他们可以帮小孩子解决什么问题。  NaN  \n",
       "4512                                          而且老师也很难教。  NaN  \n",
       "4513                         这样学校及父母们都会知道也会有小朋友每天活动的记录。  NaN  \n",
       "\n",
       "[4514 rows x 5 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>original_text</th>\n",
       "      <th>errors</th>\n",
       "      <th>correct_text</th>\n",
       "      <th>0</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-</td>\n",
       "      <td>今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式...</td>\n",
       "      <td>[{'original_error': '藉君', 'type': 'spelling_er...</td>\n",
       "      <td>今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式...</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-</td>\n",
       "      <td>根据三年前签署的全球暖化问题京都议定书，福有国家保证减少造成温室效应的气体排放量这些气体包括...</td>\n",
       "      <td>[{'original_error': '福有国家', 'type': 'spelling_...</td>\n",
       "      <td>根据三年前签署的全球暖化问题京都议定书，富有国家保证减少造成温室效应的气体排放量。这些气体包...</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-</td>\n",
       "      <td>据报导，美国战机自二十曰起即在硫磺岛举行军事演习。</td>\n",
       "      <td>[{'original_error': '曰', 'type': 'spelling_err...</td>\n",
       "      <td>据报导，美国战机自二十日起即在硫磺岛举行军事演习。</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-</td>\n",
       "      <td>目击者称，以军已把封锁路障除去，不过备关卡检查站仍有坦克派驻，车辆已能来往通过，只是流量很漫。</td>\n",
       "      <td>[{'original_error': '备', 'type': 'spelling_err...</td>\n",
       "      <td>目击者称，以军已把封锁路障除去，不过各关卡检查站仍有坦克派驻，车辆已能来往通过，只是流量很慢。</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-</td>\n",
       "      <td>华盛顿时撮同时报导，华府计划在一年内将驻在南韩首都汉城美军总部的七千多名人员，大部分移往他处。</td>\n",
       "      <td>[{'original_error': '时撮', 'type': 'spelling_er...</td>\n",
       "      <td>华盛顿时报同时报导，华府计划在一年内将驻在韩国首都首尔美军总部的七千多名人员，大部分移往他处。</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4509</th>\n",
       "      <td>B2-4393-3</td>\n",
       "      <td>整天都有人能检查你在家做甚么，有没有以政府说的去做事。</td>\n",
       "      <td>[{'original_error': '甚么', 'type': 'spelling_er...</td>\n",
       "      <td>整天都有人能检查你在家做什么，有没有按照政府说的去做事。</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4510</th>\n",
       "      <td>B2-4396-2</td>\n",
       "      <td>但是我觉的学教有焋影机也好，如有发生意外老师们关查比交容易，不一定给家长在家有没有看到，还是...</td>\n",
       "      <td>[{'original_error': '觉的', 'type': 'spelling_er...</td>\n",
       "      <td>但是我觉得学校有摄像机也好，如有发生意外老师们观察比较容易，不一定给家长在家有没有看到，还是...</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4511</th>\n",
       "      <td>B2-4399-3</td>\n",
       "      <td>然后，因为妈妈或爸爸一直看录音机，所以他们可以帮小孩子解决甚么问题。</td>\n",
       "      <td>[{'original_error': '看录音机', 'type': 'word_choi...</td>\n",
       "      <td>然后，因为妈妈或爸爸一直听录音机，所以他们可以帮小孩子解决什么问题。</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4512</th>\n",
       "      <td>B2-4399-4</td>\n",
       "      <td>而且老师也很难教师。</td>\n",
       "      <td>[{'original_error': '教师', 'type': 'grammar_err...</td>\n",
       "      <td>而且老师也很难教。</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4513</th>\n",
       "      <td>B2-4402-2</td>\n",
       "      <td>这样学校及父母们都会知道也会有小朋友每天活动的挤入。</td>\n",
       "      <td>[{'original_error': '挤入', 'type': 'grammar_err...</td>\n",
       "      <td>这样学校及父母们都会知道也会有小朋友每天活动的记录。</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>4514 rows × 5 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 9
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-28T06:14:04.055312Z",
     "start_time": "2024-08-28T06:14:04.046089Z"
    }
   },
   "cell_type": "code",
   "source": [
    "df1 = df1[['id', 'original_text', 'errors', 'correct_text']]\n",
    "df1 = df1[df1['original_text'].str.len() > 1]\n",
    "df1 = df1[df1['correct_text'].str.len() > 1]\n",
    "df = df1\n",
    "df"
   ],
   "id": "1f0dbe2721ec7f73",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "             id                                      original_text  \\\n",
       "0             -  今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式...   \n",
       "1             -  根据三年前签署的全球暖化问题京都议定书，福有国家保证减少造成温室效应的气体排放量这些气体包括...   \n",
       "2             -                          据报导，美国战机自二十曰起即在硫磺岛举行军事演习。   \n",
       "3             -    目击者称，以军已把封锁路障除去，不过备关卡检查站仍有坦克派驻，车辆已能来往通过，只是流量很漫。   \n",
       "4             -    华盛顿时撮同时报导，华府计划在一年内将驻在南韩首都汉城美军总部的七千多名人员，大部分移往他处。   \n",
       "...         ...                                                ...   \n",
       "4509  B2-4393-3                        整天都有人能检查你在家做甚么，有没有以政府说的去做事。   \n",
       "4510  B2-4396-2  但是我觉的学教有焋影机也好，如有发生意外老师们关查比交容易，不一定给家长在家有没有看到，还是...   \n",
       "4511  B2-4399-3                 然后，因为妈妈或爸爸一直看录音机，所以他们可以帮小孩子解决甚么问题。   \n",
       "4512  B2-4399-4                                         而且老师也很难教师。   \n",
       "4513  B2-4402-2                         这样学校及父母们都会知道也会有小朋友每天活动的挤入。   \n",
       "\n",
       "                                                 errors  \\\n",
       "0     [{'original_error': '藉君', 'type': 'spelling_er...   \n",
       "1     [{'original_error': '福有国家', 'type': 'spelling_...   \n",
       "2     [{'original_error': '曰', 'type': 'spelling_err...   \n",
       "3     [{'original_error': '备', 'type': 'spelling_err...   \n",
       "4     [{'original_error': '时撮', 'type': 'spelling_er...   \n",
       "...                                                 ...   \n",
       "4509  [{'original_error': '甚么', 'type': 'spelling_er...   \n",
       "4510  [{'original_error': '觉的', 'type': 'spelling_er...   \n",
       "4511  [{'original_error': '看录音机', 'type': 'word_choi...   \n",
       "4512  [{'original_error': '教师', 'type': 'grammar_err...   \n",
       "4513  [{'original_error': '挤入', 'type': 'grammar_err...   \n",
       "\n",
       "                                           correct_text  \n",
       "0     今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式...  \n",
       "1     根据三年前签署的全球暖化问题京都议定书，富有国家保证减少造成温室效应的气体排放量。这些气体包...  \n",
       "2                             据报导，美国战机自二十日起即在硫磺岛举行军事演习。  \n",
       "3       目击者称，以军已把封锁路障除去，不过各关卡检查站仍有坦克派驻，车辆已能来往通过，只是流量很慢。  \n",
       "4       华盛顿时报同时报导，华府计划在一年内将驻在韩国首都首尔美军总部的七千多名人员，大部分移往他处。  \n",
       "...                                                 ...  \n",
       "4509                       整天都有人能检查你在家做什么，有没有按照政府说的去做事。  \n",
       "4510  但是我觉得学校有摄像机也好，如有发生意外老师们观察比较容易，不一定给家长在家有没有看到，还是...  \n",
       "4511                 然后，因为妈妈或爸爸一直听录音机，所以他们可以帮小孩子解决什么问题。  \n",
       "4512                                          而且老师也很难教。  \n",
       "4513                         这样学校及父母们都会知道也会有小朋友每天活动的记录。  \n",
       "\n",
       "[4508 rows x 4 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>original_text</th>\n",
       "      <th>errors</th>\n",
       "      <th>correct_text</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-</td>\n",
       "      <td>今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式...</td>\n",
       "      <td>[{'original_error': '藉君', 'type': 'spelling_er...</td>\n",
       "      <td>今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-</td>\n",
       "      <td>根据三年前签署的全球暖化问题京都议定书，福有国家保证减少造成温室效应的气体排放量这些气体包括...</td>\n",
       "      <td>[{'original_error': '福有国家', 'type': 'spelling_...</td>\n",
       "      <td>根据三年前签署的全球暖化问题京都议定书，富有国家保证减少造成温室效应的气体排放量。这些气体包...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-</td>\n",
       "      <td>据报导，美国战机自二十曰起即在硫磺岛举行军事演习。</td>\n",
       "      <td>[{'original_error': '曰', 'type': 'spelling_err...</td>\n",
       "      <td>据报导，美国战机自二十日起即在硫磺岛举行军事演习。</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-</td>\n",
       "      <td>目击者称，以军已把封锁路障除去，不过备关卡检查站仍有坦克派驻，车辆已能来往通过，只是流量很漫。</td>\n",
       "      <td>[{'original_error': '备', 'type': 'spelling_err...</td>\n",
       "      <td>目击者称，以军已把封锁路障除去，不过各关卡检查站仍有坦克派驻，车辆已能来往通过，只是流量很慢。</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-</td>\n",
       "      <td>华盛顿时撮同时报导，华府计划在一年内将驻在南韩首都汉城美军总部的七千多名人员，大部分移往他处。</td>\n",
       "      <td>[{'original_error': '时撮', 'type': 'spelling_er...</td>\n",
       "      <td>华盛顿时报同时报导，华府计划在一年内将驻在韩国首都首尔美军总部的七千多名人员，大部分移往他处。</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4509</th>\n",
       "      <td>B2-4393-3</td>\n",
       "      <td>整天都有人能检查你在家做甚么，有没有以政府说的去做事。</td>\n",
       "      <td>[{'original_error': '甚么', 'type': 'spelling_er...</td>\n",
       "      <td>整天都有人能检查你在家做什么，有没有按照政府说的去做事。</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4510</th>\n",
       "      <td>B2-4396-2</td>\n",
       "      <td>但是我觉的学教有焋影机也好，如有发生意外老师们关查比交容易，不一定给家长在家有没有看到，还是...</td>\n",
       "      <td>[{'original_error': '觉的', 'type': 'spelling_er...</td>\n",
       "      <td>但是我觉得学校有摄像机也好，如有发生意外老师们观察比较容易，不一定给家长在家有没有看到，还是...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4511</th>\n",
       "      <td>B2-4399-3</td>\n",
       "      <td>然后，因为妈妈或爸爸一直看录音机，所以他们可以帮小孩子解决甚么问题。</td>\n",
       "      <td>[{'original_error': '看录音机', 'type': 'word_choi...</td>\n",
       "      <td>然后，因为妈妈或爸爸一直听录音机，所以他们可以帮小孩子解决什么问题。</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4512</th>\n",
       "      <td>B2-4399-4</td>\n",
       "      <td>而且老师也很难教师。</td>\n",
       "      <td>[{'original_error': '教师', 'type': 'grammar_err...</td>\n",
       "      <td>而且老师也很难教。</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4513</th>\n",
       "      <td>B2-4402-2</td>\n",
       "      <td>这样学校及父母们都会知道也会有小朋友每天活动的挤入。</td>\n",
       "      <td>[{'original_error': '挤入', 'type': 'grammar_err...</td>\n",
       "      <td>这样学校及父母们都会知道也会有小朋友每天活动的记录。</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>4508 rows × 4 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 10
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-28T06:14:07.350508Z",
     "start_time": "2024-08-28T06:14:07.329120Z"
    }
   },
   "cell_type": "code",
   "source": [
    "output_file_path = 'csc_gpt4o.jsonl'\n",
    "\n",
    "df.to_json(output_file_path, orient='records', lines=True, force_ascii=False)\n",
    "\n",
    "\n",
    "print(f\"数据已保存到 {output_file_path}\")"
   ],
   "id": "55597d57e820fc9b",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "数据已保存到 csc_gpt4o.jsonl\n"
     ]
    }
   ],
   "execution_count": 11
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-28T06:14:08.341182Z",
     "start_time": "2024-08-28T06:14:08.337422Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import json\n",
    "\n",
    "def convert_to_sharegpt_format(data):\n",
    "    sharegpt_data = []\n",
    "    system_prompt = \"文本纠错：\"\n",
    "    for idx, record in enumerate(data):\n",
    "        convs = []\n",
    "        inp = str(record['original_text'])\n",
    "        err = record['errors']\n",
    "        output = str(record['correct_text'])\n",
    "        \n",
    "        q = system_prompt + '\\n\\n' + inp\n",
    "        a = output + '\\n\\nerrors:' + json.dumps(err, ensure_ascii=False) \n",
    "        convs.append([\n",
    "            {\"from\": \"human\", \"value\": q},\n",
    "            {\"from\": \"gpt\", \"value\": a}\n",
    "        ])\n",
    "        sharegpt_data.append({\"conversations\": convs})\n",
    "    return sharegpt_data\n",
    "\n",
    "   "
   ],
   "id": "cf8f442103c92af9",
   "outputs": [],
   "execution_count": 12
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-28T06:14:09.740877Z",
     "start_time": "2024-08-28T06:14:09.690031Z"
    }
   },
   "cell_type": "code",
   "source": [
    "\n",
    "ds = df.to_dict(orient='records')\n",
    "print(ds[:3])\n",
    "# 进行转换\n",
    "sharegpt_formatted_data = convert_to_sharegpt_format(ds)\n",
    "sharegpt_formatted_data[:2], len(sharegpt_formatted_data)"
   ],
   "id": "2a07315b552151d0",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[{'id': '-', 'original_text': '今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式谋杀的现象，表示唯有藉君提升妇女的社会地位，才能与之对抗。', 'errors': \"[{'original_error': '藉君', 'type': 'spelling_error', 'correct': '提升'}]\", 'correct_text': '今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式谋杀的现象，表示唯有提升妇女的社会地位，才能与之对抗。'}, {'id': '-', 'original_text': '根据三年前签署的全球暖化问题京都议定书，福有国家保证减少造成温室效应的气体排放量这些气体包括二氧化碳与燃烧石油、煤、天然气等产生的其他副产品。', 'errors': \"[{'original_error': '福有国家', 'type': 'spelling_error', 'correct': '富有国家'}, {'original_error': '排放量这些气体包括', 'type': 'missing_punctuation', 'correct': '排放量。这些气体包括'}]\", 'correct_text': '根据三年前签署的全球暖化问题京都议定书，富有国家保证减少造成温室效应的气体排放量。这些气体包括二氧化碳与燃烧石油、煤、天然气等产生的其他副产品。'}, {'id': '-', 'original_text': '据报导，美国战机自二十曰起即在硫磺岛举行军事演习。', 'errors': \"[{'original_error': '曰', 'type': 'spelling_error', 'correct': '日'}]\", 'correct_text': '据报导，美国战机自二十日起即在硫磺岛举行军事演习。'}]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([{'conversations': [[{'from': 'human',\n",
       "      'value': '文本纠错：\\n\\n今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式谋杀的现象，表示唯有藉君提升妇女的社会地位，才能与之对抗。'},\n",
       "     {'from': 'gpt',\n",
       "      'value': '今天在瑞典政府主办的一场国际研讨会上，与会代表讨论到每年数千名妇女遭其父兄以所谓荣誉处决方式谋杀的现象，表示唯有提升妇女的社会地位，才能与之对抗。\\n\\nerrors:\"[{\\'original_error\\': \\'藉君\\', \\'type\\': \\'spelling_error\\', \\'correct\\': \\'提升\\'}]\"'}]]},\n",
       "  {'conversations': [[{'from': 'human',\n",
       "      'value': '文本纠错：\\n\\n根据三年前签署的全球暖化问题京都议定书，福有国家保证减少造成温室效应的气体排放量这些气体包括二氧化碳与燃烧石油、煤、天然气等产生的其他副产品。'},\n",
       "     {'from': 'gpt',\n",
       "      'value': '根据三年前签署的全球暖化问题京都议定书，富有国家保证减少造成温室效应的气体排放量。这些气体包括二氧化碳与燃烧石油、煤、天然气等产生的其他副产品。\\n\\nerrors:\"[{\\'original_error\\': \\'福有国家\\', \\'type\\': \\'spelling_error\\', \\'correct\\': \\'富有国家\\'}, {\\'original_error\\': \\'排放量这些气体包括\\', \\'type\\': \\'missing_punctuation\\', \\'correct\\': \\'排放量。这些气体包括\\'}]\"'}]]}],\n",
       " 4508)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 13
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-28T06:14:10.449569Z",
     "start_time": "2024-08-28T06:14:10.428429Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 输出 JSONL 格式\n",
    "output_file_path = \"sharegpt_formatted_data_csc.jsonl\"\n",
    "\n",
    "with open(output_file_path, 'w', encoding='utf-8') as f:\n",
    "    for entry in sharegpt_formatted_data:\n",
    "        f.write(json.dumps(entry, ensure_ascii=False) + '\\n')\n",
    "\n",
    "print(f\"数据已保存到 {output_file_path}\")"
   ],
   "id": "a4e2b00f08f9dc8a",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "数据已保存到 sharegpt_formatted_data_csc.jsonl\n"
     ]
    }
   ],
   "execution_count": 14
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## 步骤2. 使用gpt-4o补充多字、少字错误，以及语法错误；扩充纠错数据集，提升多样性；做法：用few-shot学习的方式，基于self-instruct方法让gpt-4o生成新的纠错case。",
   "id": "29718b4b5c8c15bb"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-28T06:14:15.897426Z",
     "start_time": "2024-08-28T06:14:15.772407Z"
    }
   },
   "cell_type": "code",
   "source": "!pwd",
   "id": "856cad88e57fb509",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/Users/xuming/Documents/Codes/pycorrector/scripts\r\n"
     ]
    }
   ],
   "execution_count": 15
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-23T02:51:54.905149Z",
     "start_time": "2024-08-23T02:51:54.893256Z"
    }
   },
   "cell_type": "code",
   "source": [
    "\n",
    "with open(\"../examples/data/grammar/test_sharegpt.jsonl\", 'r') as f:\n",
    "    data1 = [json.loads(i) for i in f.readlines()]\n",
    "with open(\"../examples/data/grammar/train_sharegpt.jsonl\", 'r') as f:\n",
    "    data2 = [json.loads(i) for i in f.readlines()]\n",
    "    \n",
    "data = data1 + data2\n",
    "data[:3], len(data)"
   ],
   "id": "f6afca46fa388d35",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([{'conversations': [{'from': 'human',\n",
       "     'value': '对这个句子语法纠错\\n\\n2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世界展示一个充满底蕴又创新进取的广州。'},\n",
       "    {'from': 'gpt',\n",
       "     'value': '自2017年《财富》全球论坛宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世界展示一个充满底蕴又创新进取的广州。'}]},\n",
       "  {'conversations': [{'from': 'human',\n",
       "     'value': '对这个句子语法纠错\\n\\n它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。'},\n",
       "    {'from': 'gpt', 'value': '它渐渐失去了青苍的颜色，变成柔绿，变成嫩黄，枝条变成细瘦，变成娇弱，好像病了的孩子。'}]},\n",
       "  {'conversations': [{'from': 'human',\n",
       "     'value': '对这个句子语法纠错\\n\\n可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着音响，尘埃和湿气的。'},\n",
       "    {'from': 'gpt',\n",
       "     'value': '可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着音响，尘埃和湿气的问题。'}]}],\n",
       " 1561)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 20
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-23T02:51:55.013533Z",
     "start_time": "2024-08-23T02:51:55.009384Z"
    }
   },
   "cell_type": "code",
   "source": [
    "input_sents = [(i['conversations'][0]['value'], i['conversations'][1]['value']) for i in data]\n",
    "input_sents = [(i.replace(\"对这个句子语法纠错\\n\\n\", \"\"),j) for (i,j) in input_sents]\n",
    "input_sents = [i for i in input_sents if len(i[0]) > 0 and len(i[1]) > 0]\n",
    "input_sents[:3], len(input_sents)"
   ],
   "id": "d20d71a7bae13ece",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([('2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世界展示一个充满底蕴又创新进取的广州。',\n",
       "   '自2017年《财富》全球论坛宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世界展示一个充满底蕴又创新进取的广州。'),\n",
       "  ('它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。',\n",
       "   '它渐渐失去了青苍的颜色，变成柔绿，变成嫩黄，枝条变成细瘦，变成娇弱，好像病了的孩子。'),\n",
       "  ('可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着音响，尘埃和湿气的。',\n",
       "   '可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着音响，尘埃和湿气的问题。')],\n",
       " 1561)"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 21
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-23T02:51:55.163711Z",
     "start_time": "2024-08-23T02:51:55.160457Z"
    }
   },
   "cell_type": "code",
   "source": [
    "input_grammar_ds = [{\"id\": f'grammar-{id}', \"original_text\": sent[0], \"wrong_ids\": [], \"correct_text\": \"\"} for id,sent in enumerate(input_sents)]\n",
    "input_grammar_ds[:3], len(input_grammar_ds)"
   ],
   "id": "9f7f569c6e238c64",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([{'id': 'grammar-0',\n",
       "   'original_text': '2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世界展示一个充满底蕴又创新进取的广州。',\n",
       "   'wrong_ids': [],\n",
       "   'correct_text': ''},\n",
       "  {'id': 'grammar-1',\n",
       "   'original_text': '它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。',\n",
       "   'wrong_ids': [],\n",
       "   'correct_text': ''},\n",
       "  {'id': 'grammar-2',\n",
       "   'original_text': '可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着音响，尘埃和湿气的。',\n",
       "   'wrong_ids': [],\n",
       "   'correct_text': ''}],\n",
       " 1561)"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 22
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-23T02:52:02.546578Z",
     "start_time": "2024-08-23T02:51:55.311647Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 示例问题和回答\n",
    "q = \"\"\"\n",
    "{'id': '-',\n",
    "   'original_text': '可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着音响，尘埃和湿气的。',\n",
    "   'wrong_ids': [],\n",
    "   'correct_text': ''}\n",
    "\"\"\"\n",
    "\n",
    "# 发送请求并获取评估\n",
    "origin_res, r = correct_ds(q)\n",
    "origin_res, r"
   ],
   "id": "1f30c0f79906a88b",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "('```\\n{\"id\": \"-\",\"original_text\": \"可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着音响，尘埃和湿气的。\",\"errors\":[{\"original_error\": \"音响\",\"type\": \"spelling_error\",\"correct\": \"音响（应为噪音）\"}],\"correct_text\": \"可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着噪音，尘埃和湿气的。\"}\\n```',\n",
       " {'id': '-',\n",
       "  'original_text': '可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着音响，尘埃和湿气的。',\n",
       "  'errors': [{'original_error': '音响',\n",
       "    'type': 'spelling_error',\n",
       "    'correct': '音响（应为噪音）'}],\n",
       "  'correct_text': '可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着噪音，尘埃和湿气的。'})"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 23
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-23T02:52:09.671116Z",
     "start_time": "2024-08-23T02:52:02.550277Z"
    }
   },
   "cell_type": "code",
   "source": [
    "for i in input_grammar_ds[:2]:\n",
    "    print(i)\n",
    "    q = str(i)\n",
    "    origin_res, r = correct_ds(q)\n",
    "    print(origin_res, r)\n",
    "\n"
   ],
   "id": "3f270eec505825e8",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'id': 'grammar-0', 'original_text': '2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世界展示一个充满底蕴又创新进取的广州。', 'wrong_ids': [], 'correct_text': ''}\n",
      "```\n",
      "{\"id\": \"grammar-0\", \"original_text\": \"2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世界展示一个充满底蕴又创新进取的广州。\", \"errors\": [], \"correct_text\": \"2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世界展示一个充满底蕴又创新进取的广州。\"}\n",
      "``` {'id': 'grammar-0', 'original_text': '2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世界展示一个充满底蕴又创新进取的广州。', 'errors': [], 'correct_text': '2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世界展示一个充满底蕴又创新进取的广州。'}\n",
      "{'id': 'grammar-1', 'original_text': '它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。', 'wrong_ids': [], 'correct_text': ''}\n",
      "```json\n",
      "{\"id\": \"grammar-1\",\"original_text\": \"它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。\",\"errors\":[],\"correct_text\":\"它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。\"}\n",
      "``` {'id': 'grammar-1', 'original_text': '它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。', 'errors': [], 'correct_text': '它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。'}\n"
     ]
    }
   ],
   "execution_count": 24
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## 批量执行",
   "id": "12e4cc4bd5665e29"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-23T04:14:05.881117Z",
     "start_time": "2024-08-23T02:53:13.532578Z"
    }
   },
   "cell_type": "code",
   "source": [
    "\n",
    "from tqdm import tqdm\n",
    "# 初始化一个空的DataFrame，用于存储预测结果\n",
    "df = pd.DataFrame(columns=['id', 'original_text', 'errors', 'correct_text'])\n",
    "output_file_path_temp = 'grammar_gpt4o.csv'\n",
    "output_file_path = 'grammar_gpt4o.xlsx'\n",
    "output_file_path_jsonl = 'grammar_gpt4o.jsonl'\n",
    "# 遍历query_list中的每个问题\n",
    "for idx, q in enumerate(tqdm(input_grammar_ds[:], desc=\"Processing\")):\n",
    "    origin_res, r = correct_ds(str(q))\n",
    "    if r:\n",
    "        if idx < 10:\n",
    "            print(idx, q, origin_res, r)\n",
    "\n",
    "        new_df = pd.DataFrame([r])\n",
    "        df = pd.concat([df, new_df], ignore_index=True)\n",
    "\n",
    "        if idx > 1 and idx % 10 == 0:\n",
    "            df.to_csv(output_file_path_temp, index=False)\n",
    "\n",
    "df.to_csv(output_file_path_temp, index=False)\n",
    "df.to_excel(output_file_path, index=False)\n",
    "df.to_json(output_file_path_jsonl, orient='records', lines=True, force_ascii=False)"
   ],
   "id": "3cdbec2afdceaf4",
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:   0%|          | 1/1561 [00:04<2:03:21,  4.74s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 {'id': 'grammar-0', 'original_text': '2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世界展示一个充满底蕴又创新进取的广州。', 'wrong_ids': [], 'correct_text': ''} ```\n",
      "{\"id\": \"grammar-0\", \"original_text\": \"2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世界展示一个充满底蕴又创新进取的广州。\", \"errors\": [], \"correct_text\": \"2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世界展示一个充满底蕴又创新进取的广州。\"}\n",
      "``` {'id': 'grammar-0', 'original_text': '2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世界展示一个充满底蕴又创新进取的广州。', 'errors': [], 'correct_text': '2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世界展示一个充满底蕴又创新进取的广州。'}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:   0%|          | 2/1561 [00:07<1:32:39,  3.57s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 {'id': 'grammar-1', 'original_text': '它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。', 'wrong_ids': [], 'correct_text': ''} ```jsonl\n",
      "{\"id\": \"grammar-1\",\"original_text\": \"它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。\",\"errors\":[],\"correct_text\": \"它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。\"}\n",
      "``` {'id': 'grammar-1', 'original_text': '它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。', 'errors': [], 'correct_text': '它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。'}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:   0%|          | 3/1561 [00:10<1:31:52,  3.54s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2 {'id': 'grammar-2', 'original_text': '可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着音响，尘埃和湿气的。', 'wrong_ids': [], 'correct_text': ''} ```\n",
      "{\"id\": \"grammar-2\",\"original_text\": \"可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着音响，尘埃和湿气的。\",\"errors\":[{\"original_error\": \"音响\",\"type\": \"wrong_word\",\"correct\": \"噪音\"},{\"original_error\": \"的\",\"type\": \"extra_word\",\"correct\": \"\"}],\"correct_text\": \"可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着噪音，尘埃和湿气。\"}\n",
      "``` {'id': 'grammar-2', 'original_text': '可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着音响，尘埃和湿气的。', 'errors': [{'original_error': '音响', 'type': 'wrong_word', 'correct': '噪音'}, {'original_error': '的', 'type': 'extra_word', 'correct': ''}], 'correct_text': '可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着噪音，尘埃和湿气。'}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:   0%|          | 4/1561 [00:14<1:34:06,  3.63s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3 {'id': 'grammar-3', 'original_text': '热播剧《山海情》的故事发生在宁夏西海固地区。为了保护当地生态环境和群众生活，20世纪八十年代，当地政府组织6万余名西海固人陆续从大山深处搬迁扎根到宁夏平原的闽宁镇，走上了脱贫致富之路。', 'wrong_ids': [], 'correct_text': ''} ```\n",
      "{\"id\": \"grammar-3\",\"original_text\": \"热播剧《山海情》的故事发生在宁夏西海固地区。为了保护当地生态环境和群众生活，20世纪八十年代，当地政府组织6万余名西海固人陆续从大山深处搬迁扎根到宁夏平原的闽宁镇，走上了脱贫致富之路。\",\"errors\":[],\"correct_text\": \"热播剧《山海情》的故事发生在宁夏西海固地区。为了保护当地生态环境和群众生活，20世纪八十年代，当地政府组织6万余名西海固人陆续从大山深处搬迁扎根到宁夏平原的闽宁镇，走上了脱贫致富之路。\"}\n",
      "``` {'id': 'grammar-3', 'original_text': '热播剧《山海情》的故事发生在宁夏西海固地区。为了保护当地生态环境和群众生活，20世纪八十年代，当地政府组织6万余名西海固人陆续从大山深处搬迁扎根到宁夏平原的闽宁镇，走上了脱贫致富之路。', 'errors': [], 'correct_text': '热播剧《山海情》的故事发生在宁夏西海固地区。为了保护当地生态环境和群众生活，20世纪八十年代，当地政府组织6万余名西海固人陆续从大山深处搬迁扎根到宁夏平原的闽宁镇，走上了脱贫致富之路。'}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:   0%|          | 5/1561 [00:17<1:24:02,  3.24s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4 {'id': 'grammar-4', 'original_text': '老同志不但关心我，就是和他一起入伍的新同志也经常帮助我，这使我非常感动。', 'wrong_ids': [], 'correct_text': ''} ```jsonl\n",
      "{\"id\": \"grammar-4\",\"original_text\": \"老同志不但关心我，就是和他一起入伍的新同志也经常帮助我，这使我非常感动。\",\"errors\":[{\"original_error\": \"就是\",\"type\": \"grammar_error\",\"correct\": \"而且\"}],\"correct_text\": \"老同志不但关心我，而且和他一起入伍的新同志也经常帮助我，这使我非常感动。\"}\n",
      "``` {'id': 'grammar-4', 'original_text': '老同志不但关心我，就是和他一起入伍的新同志也经常帮助我，这使我非常感动。', 'errors': [{'original_error': '就是', 'type': 'grammar_error', 'correct': '而且'}], 'correct_text': '老同志不但关心我，而且和他一起入伍的新同志也经常帮助我，这使我非常感动。'}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:   0%|          | 6/1561 [00:20<1:24:05,  3.24s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5 {'id': 'grammar-5', 'original_text': '这次羽毛球邀请赛在新建的贺家山体育馆举行，参赛选手通过小组赛和复赛、决赛的激烈角逐，最后张碧江、邓丹捷分别获得了冠亚军。', 'wrong_ids': [], 'correct_text': ''} ```json\n",
      "{\"id\": \"grammar-5\", \"original_text\": \"这次羽毛球邀请赛在新建的贺家山体育馆举行，参赛选手通过小组赛和复赛、决赛的激烈角逐，最后张碧江、邓丹捷分别获得了冠亚军。\", \"errors\": [], \"correct_text\": \"这次羽毛球邀请赛在新建的贺家山体育馆举行，参赛选手通过小组赛和复赛、决赛的激烈角逐，最后张碧江、邓丹捷分别获得了冠亚军。\"}\n",
      "``` {'id': 'grammar-5', 'original_text': '这次羽毛球邀请赛在新建的贺家山体育馆举行，参赛选手通过小组赛和复赛、决赛的激烈角逐，最后张碧江、邓丹捷分别获得了冠亚军。', 'errors': [], 'correct_text': '这次羽毛球邀请赛在新建的贺家山体育馆举行，参赛选手通过小组赛和复赛、决赛的激烈角逐，最后张碧江、邓丹捷分别获得了冠亚军。'}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:   0%|          | 7/1561 [00:22<1:13:31,  2.84s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "6 {'id': 'grammar-6', 'original_text': '从争做中国好网民，才年汇聚网络正能量，占领主战场，让各种网络谣言、欺诈、色情信息没有立足之处，从而构建起无限生机与正义的中国网络正能量。', 'wrong_ids': [], 'correct_text': ''} ```json\n",
      "{\"id\": \"grammar-6\", \"original_text\": \"从争做中国好网民，才年汇聚网络正能量，占领主战场，让各种网络谣言、欺诈、色情信息没有立足之处，从而构建起无限生机与正义的中国网络正能量。\", \"errors\":[{\"original_error\": \"才年\", \"type\": \"grammar_error\", \"correct\": \"才能\"}], \"correct_text\": \"从争做中国好网民，才能汇聚网络正能量，占领主战场，让各种网络谣言、欺诈、色情信息没有立足之处，从而构建起无限生机与正义的中国网络正能量。\"}\n",
      "``` {'id': 'grammar-6', 'original_text': '从争做中国好网民，才年汇聚网络正能量，占领主战场，让各种网络谣言、欺诈、色情信息没有立足之处，从而构建起无限生机与正义的中国网络正能量。', 'errors': [{'original_error': '才年', 'type': 'grammar_error', 'correct': '才能'}], 'correct_text': '从争做中国好网民，才能汇聚网络正能量，占领主战场，让各种网络谣言、欺诈、色情信息没有立足之处，从而构建起无限生机与正义的中国网络正能量。'}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:   1%|          | 8/1561 [00:25<1:13:51,  2.85s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "7 {'id': 'grammar-7', 'original_text': '首都师范大学教授周世斌认为，校园音乐教育不能缺少音乐实践，应该保证学生演唱或者演奏音乐的权利。', 'wrong_ids': [], 'correct_text': ''} ```json\n",
      "{\"id\": \"grammar-7\",\"original_text\": \"首都师范大学教授周世斌认为，校园音乐教育不能缺少音乐实践，应该保证学生演唱或者演奏音乐的权利。\",\"errors\":[],\"correct_text\": \"首都师范大学教授周世斌认为，校园音乐教育不能缺少音乐实践，应该保证学生演唱或者演奏音乐的权利。\"}\n",
      "``` {'id': 'grammar-7', 'original_text': '首都师范大学教授周世斌认为，校园音乐教育不能缺少音乐实践，应该保证学生演唱或者演奏音乐的权利。', 'errors': [], 'correct_text': '首都师范大学教授周世斌认为，校园音乐教育不能缺少音乐实践，应该保证学生演唱或者演奏音乐的权利。'}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:   1%|          | 9/1561 [00:27<1:07:47,  2.62s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "8 {'id': 'grammar-8', 'original_text': '长征五号肩负着开展载人航天空间站建设、月球采样返回、火星探测等多项重大航天工程，是承载中华民族对浩瀚宇宙向往的“梦想之箭”。', 'wrong_ids': [], 'correct_text': ''} ```json\n",
      "{\"id\": \"grammar-8\", \"original_text\": \"长征五号肩负着开展载人航天空间站建设、月球采样返回、火星探测等多项重大航天工程，是承载中华民族对浩瀚宇宙向往的“梦想之箭”。\", \"errors\": [], \"correct_text\": \"长征五号肩负着开展载人航天空间站建设、月球采样返回、火星探测等多项重大航天工程，是承载中华民族对浩瀚宇宙向往的“梦想之箭”。\"}\n",
      "``` {'id': 'grammar-8', 'original_text': '长征五号肩负着开展载人航天空间站建设、月球采样返回、火星探测等多项重大航天工程，是承载中华民族对浩瀚宇宙向往的“梦想之箭”。', 'errors': [], 'correct_text': '长征五号肩负着开展载人航天空间站建设、月球采样返回、火星探测等多项重大航天工程，是承载中华民族对浩瀚宇宙向往的“梦想之箭”。'}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:   1%|          | 10/1561 [00:30<1:11:30,  2.77s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "9 {'id': 'grammar-9', 'original_text': '莫言的作品充满着“怀乡”以及“怨乡”的复杂情感，建构了独特的主观感觉世界，带有明显的“先锋”色彩，被归类为“寻根文学”作家。', 'wrong_ids': [], 'correct_text': ''} ```\n",
      "{\"id\": \"grammar-9\", \"original_text\": \"莫言的作品充满着“怀乡”以及“怨乡”的复杂情感，建构了独特的主观感觉世界，带有明显的“先锋”色彩，被归类为“寻根文学”作家。\", \"errors\": [], \"correct_text\": \"莫言的作品充满着“怀乡”以及“怨乡”的复杂情感，建构了独特的主观感觉世界，带有明显的“先锋”色彩，被归类为“寻根文学”作家。\"}\n",
      "``` {'id': 'grammar-9', 'original_text': '莫言的作品充满着“怀乡”以及“怨乡”的复杂情感，建构了独特的主观感觉世界，带有明显的“先锋”色彩，被归类为“寻根文学”作家。', 'errors': [], 'correct_text': '莫言的作品充满着“怀乡”以及“怨乡”的复杂情感，建构了独特的主观感觉世界，带有明显的“先锋”色彩，被归类为“寻根文学”作家。'}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing:  46%|████▌     | 719/1561 [43:02<43:11,  3.08s/it]  "
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extra data: line 1 column 223 (char 222)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Processing: 100%|██████████| 1561/1561 [1:20:52<00:00,  3.11s/it]\n"
     ]
    }
   ],
   "execution_count": 29
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-28T06:15:52.691541Z",
     "start_time": "2024-08-28T06:15:52.672797Z"
    }
   },
   "cell_type": "code",
   "source": [
    "df1 = pd.read_csv(\"grammar_gpt4o.csv\")\n",
    "df1"
   ],
   "id": "b15a4503f3d320f0",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "                id                                      original_text  \\\n",
       "0        grammar-0  2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世...   \n",
       "1        grammar-1         它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。   \n",
       "2        grammar-2  可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着音响，...   \n",
       "3        grammar-3  热播剧《山海情》的故事发生在宁夏西海固地区。为了保护当地生态环境和群众生活，20世纪八十年代...   \n",
       "4        grammar-4               老同志不但关心我，就是和他一起入伍的新同志也经常帮助我，这使我非常感动。   \n",
       "...            ...                                                ...   \n",
       "1556  grammar-1556          上海的庙会是流传于中国北方地区的民俗文化活动，是唯一一个中国国家级非物质文化遗产。   \n",
       "1557  grammar-1557                在这个多姿多彩的世界中，广大芸芸众生共同构成了人类的多样性和繁荣。\\n   \n",
       "1558  grammar-1558                                      通过学习，使我提高了认识。   \n",
       "1559  grammar-1559                         这本小说的情节和文笔可以堪称现代文学的经典之作。\\n   \n",
       "1560  grammar-1560               过高的奢望会给自己带来巨大的压力和失望，因为现实往往与理想有很大的差距。   \n",
       "\n",
       "                                                 errors  \\\n",
       "0                                                    []   \n",
       "1                                                    []   \n",
       "2     [{'original_error': '音响', 'type': 'wrong_word'...   \n",
       "3                                                    []   \n",
       "4     [{'original_error': '就是', 'type': 'grammar_err...   \n",
       "...                                                 ...   \n",
       "1556                                                 []   \n",
       "1557                                                 []   \n",
       "1558  [{'original_error': '使我提高了认识', 'type': 'gramma...   \n",
       "1559                                                 []   \n",
       "1560                                                 []   \n",
       "\n",
       "                                           correct_text    0  \n",
       "0     2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世...  NaN  \n",
       "1            它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。  NaN  \n",
       "2     可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着噪音，...  NaN  \n",
       "3     热播剧《山海情》的故事发生在宁夏西海固地区。为了保护当地生态环境和群众生活，20世纪八十年代...  NaN  \n",
       "4                  老同志不但关心我，而且和他一起入伍的新同志也经常帮助我，这使我非常感动。  NaN  \n",
       "...                                                 ...  ...  \n",
       "1556          上海的庙会是流传于中国北方地区的民俗文化活动，是唯一一个中国国家级非物质文化遗产。  NaN  \n",
       "1557                  在这个多姿多彩的世界中，广大芸芸众生共同构成了人类的多样性和繁荣。  NaN  \n",
       "1558                                       通过学习，我提高了认识。  NaN  \n",
       "1559                         这本小说的情节和文笔可以堪称现代文学的经典之作。\\n  NaN  \n",
       "1560               过高的奢望会给自己带来巨大的压力和失望，因为现实往往与理想有很大的差距。  NaN  \n",
       "\n",
       "[1561 rows x 5 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>original_text</th>\n",
       "      <th>errors</th>\n",
       "      <th>correct_text</th>\n",
       "      <th>0</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>grammar-0</td>\n",
       "      <td>2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世...</td>\n",
       "      <td>[]</td>\n",
       "      <td>2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世...</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>grammar-1</td>\n",
       "      <td>它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。</td>\n",
       "      <td>[]</td>\n",
       "      <td>它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>grammar-2</td>\n",
       "      <td>可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着音响，...</td>\n",
       "      <td>[{'original_error': '音响', 'type': 'wrong_word'...</td>\n",
       "      <td>可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着噪音，...</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>grammar-3</td>\n",
       "      <td>热播剧《山海情》的故事发生在宁夏西海固地区。为了保护当地生态环境和群众生活，20世纪八十年代...</td>\n",
       "      <td>[]</td>\n",
       "      <td>热播剧《山海情》的故事发生在宁夏西海固地区。为了保护当地生态环境和群众生活，20世纪八十年代...</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>grammar-4</td>\n",
       "      <td>老同志不但关心我，就是和他一起入伍的新同志也经常帮助我，这使我非常感动。</td>\n",
       "      <td>[{'original_error': '就是', 'type': 'grammar_err...</td>\n",
       "      <td>老同志不但关心我，而且和他一起入伍的新同志也经常帮助我，这使我非常感动。</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1556</th>\n",
       "      <td>grammar-1556</td>\n",
       "      <td>上海的庙会是流传于中国北方地区的民俗文化活动，是唯一一个中国国家级非物质文化遗产。</td>\n",
       "      <td>[]</td>\n",
       "      <td>上海的庙会是流传于中国北方地区的民俗文化活动，是唯一一个中国国家级非物质文化遗产。</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1557</th>\n",
       "      <td>grammar-1557</td>\n",
       "      <td>在这个多姿多彩的世界中，广大芸芸众生共同构成了人类的多样性和繁荣。\\n</td>\n",
       "      <td>[]</td>\n",
       "      <td>在这个多姿多彩的世界中，广大芸芸众生共同构成了人类的多样性和繁荣。</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1558</th>\n",
       "      <td>grammar-1558</td>\n",
       "      <td>通过学习，使我提高了认识。</td>\n",
       "      <td>[{'original_error': '使我提高了认识', 'type': 'gramma...</td>\n",
       "      <td>通过学习，我提高了认识。</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1559</th>\n",
       "      <td>grammar-1559</td>\n",
       "      <td>这本小说的情节和文笔可以堪称现代文学的经典之作。\\n</td>\n",
       "      <td>[]</td>\n",
       "      <td>这本小说的情节和文笔可以堪称现代文学的经典之作。\\n</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1560</th>\n",
       "      <td>grammar-1560</td>\n",
       "      <td>过高的奢望会给自己带来巨大的压力和失望，因为现实往往与理想有很大的差距。</td>\n",
       "      <td>[]</td>\n",
       "      <td>过高的奢望会给自己带来巨大的压力和失望，因为现实往往与理想有很大的差距。</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1561 rows × 5 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 16
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-28T06:16:06.216549Z",
     "start_time": "2024-08-28T06:16:06.207535Z"
    }
   },
   "cell_type": "code",
   "source": [
    "df1 = df1[['id', 'original_text', 'errors', 'correct_text']]\n",
    "df1 = df1[df1['original_text'].str.len() > 1]\n",
    "df1 = df1[df1['correct_text'].str.len() > 1]\n",
    "df = df1\n",
    "df"
   ],
   "id": "218d485f4e08b504",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "                id                                      original_text  \\\n",
       "0        grammar-0  2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世...   \n",
       "1        grammar-1         它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。   \n",
       "2        grammar-2  可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着音响，...   \n",
       "3        grammar-3  热播剧《山海情》的故事发生在宁夏西海固地区。为了保护当地生态环境和群众生活，20世纪八十年代...   \n",
       "4        grammar-4               老同志不但关心我，就是和他一起入伍的新同志也经常帮助我，这使我非常感动。   \n",
       "...            ...                                                ...   \n",
       "1556  grammar-1556          上海的庙会是流传于中国北方地区的民俗文化活动，是唯一一个中国国家级非物质文化遗产。   \n",
       "1557  grammar-1557                在这个多姿多彩的世界中，广大芸芸众生共同构成了人类的多样性和繁荣。\\n   \n",
       "1558  grammar-1558                                      通过学习，使我提高了认识。   \n",
       "1559  grammar-1559                         这本小说的情节和文笔可以堪称现代文学的经典之作。\\n   \n",
       "1560  grammar-1560               过高的奢望会给自己带来巨大的压力和失望，因为现实往往与理想有很大的差距。   \n",
       "\n",
       "                                                 errors  \\\n",
       "0                                                    []   \n",
       "1                                                    []   \n",
       "2     [{'original_error': '音响', 'type': 'wrong_word'...   \n",
       "3                                                    []   \n",
       "4     [{'original_error': '就是', 'type': 'grammar_err...   \n",
       "...                                                 ...   \n",
       "1556                                                 []   \n",
       "1557                                                 []   \n",
       "1558  [{'original_error': '使我提高了认识', 'type': 'gramma...   \n",
       "1559                                                 []   \n",
       "1560                                                 []   \n",
       "\n",
       "                                           correct_text  \n",
       "0     2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世...  \n",
       "1            它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。  \n",
       "2     可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着噪音，...  \n",
       "3     热播剧《山海情》的故事发生在宁夏西海固地区。为了保护当地生态环境和群众生活，20世纪八十年代...  \n",
       "4                  老同志不但关心我，而且和他一起入伍的新同志也经常帮助我，这使我非常感动。  \n",
       "...                                                 ...  \n",
       "1556          上海的庙会是流传于中国北方地区的民俗文化活动，是唯一一个中国国家级非物质文化遗产。  \n",
       "1557                  在这个多姿多彩的世界中，广大芸芸众生共同构成了人类的多样性和繁荣。  \n",
       "1558                                       通过学习，我提高了认识。  \n",
       "1559                         这本小说的情节和文笔可以堪称现代文学的经典之作。\\n  \n",
       "1560               过高的奢望会给自己带来巨大的压力和失望，因为现实往往与理想有很大的差距。  \n",
       "\n",
       "[1559 rows x 4 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>original_text</th>\n",
       "      <th>errors</th>\n",
       "      <th>correct_text</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>grammar-0</td>\n",
       "      <td>2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世...</td>\n",
       "      <td>[]</td>\n",
       "      <td>2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>grammar-1</td>\n",
       "      <td>它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。</td>\n",
       "      <td>[]</td>\n",
       "      <td>它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>grammar-2</td>\n",
       "      <td>可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着音响，...</td>\n",
       "      <td>[{'original_error': '音响', 'type': 'wrong_word'...</td>\n",
       "      <td>可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着噪音，...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>grammar-3</td>\n",
       "      <td>热播剧《山海情》的故事发生在宁夏西海固地区。为了保护当地生态环境和群众生活，20世纪八十年代...</td>\n",
       "      <td>[]</td>\n",
       "      <td>热播剧《山海情》的故事发生在宁夏西海固地区。为了保护当地生态环境和群众生活，20世纪八十年代...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>grammar-4</td>\n",
       "      <td>老同志不但关心我，就是和他一起入伍的新同志也经常帮助我，这使我非常感动。</td>\n",
       "      <td>[{'original_error': '就是', 'type': 'grammar_err...</td>\n",
       "      <td>老同志不但关心我，而且和他一起入伍的新同志也经常帮助我，这使我非常感动。</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1556</th>\n",
       "      <td>grammar-1556</td>\n",
       "      <td>上海的庙会是流传于中国北方地区的民俗文化活动，是唯一一个中国国家级非物质文化遗产。</td>\n",
       "      <td>[]</td>\n",
       "      <td>上海的庙会是流传于中国北方地区的民俗文化活动，是唯一一个中国国家级非物质文化遗产。</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1557</th>\n",
       "      <td>grammar-1557</td>\n",
       "      <td>在这个多姿多彩的世界中，广大芸芸众生共同构成了人类的多样性和繁荣。\\n</td>\n",
       "      <td>[]</td>\n",
       "      <td>在这个多姿多彩的世界中，广大芸芸众生共同构成了人类的多样性和繁荣。</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1558</th>\n",
       "      <td>grammar-1558</td>\n",
       "      <td>通过学习，使我提高了认识。</td>\n",
       "      <td>[{'original_error': '使我提高了认识', 'type': 'gramma...</td>\n",
       "      <td>通过学习，我提高了认识。</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1559</th>\n",
       "      <td>grammar-1559</td>\n",
       "      <td>这本小说的情节和文笔可以堪称现代文学的经典之作。\\n</td>\n",
       "      <td>[]</td>\n",
       "      <td>这本小说的情节和文笔可以堪称现代文学的经典之作。\\n</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1560</th>\n",
       "      <td>grammar-1560</td>\n",
       "      <td>过高的奢望会给自己带来巨大的压力和失望，因为现实往往与理想有很大的差距。</td>\n",
       "      <td>[]</td>\n",
       "      <td>过高的奢望会给自己带来巨大的压力和失望，因为现实往往与理想有很大的差距。</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1559 rows × 4 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 17
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-28T06:16:19.652988Z",
     "start_time": "2024-08-28T06:16:19.639002Z"
    }
   },
   "cell_type": "code",
   "source": [
    "\n",
    "ds = df.to_dict(orient='records')\n",
    "print(ds[:3])\n",
    "# 进行转换\n",
    "sharegpt_formatted_data = convert_to_sharegpt_format(ds)\n",
    "sharegpt_formatted_data[:2], len(sharegpt_formatted_data)"
   ],
   "id": "178dca75846e2a15",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[{'id': 'grammar-0', 'original_text': '2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世界展示一个充满底蕴又创新进取的广州。', 'errors': '[]', 'correct_text': '2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世界展示一个充满底蕴又创新进取的广州。'}, {'id': 'grammar-1', 'original_text': '它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。', 'errors': '[]', 'correct_text': '它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。'}, {'id': 'grammar-2', 'original_text': '可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着音响，尘埃和湿气的。', 'errors': \"[{'original_error': '音响', 'type': 'wrong_word', 'correct': '噪音'}, {'original_error': '的', 'type': 'extra_word', 'correct': ''}]\", 'correct_text': '可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着噪音，尘埃和湿气。'}]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([{'conversations': [[{'from': 'human',\n",
       "      'value': '文本纠错：\\n\\n2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世界展示一个充满底蕴又创新进取的广州。'},\n",
       "     {'from': 'gpt',\n",
       "      'value': '2017年《财富》全球论坛自宣布落户广州以来，《财富》杂志将目光聚焦在广州，以财富为媒，向世界展示一个充满底蕴又创新进取的广州。\\n\\nerrors:\"[]\"'}]]},\n",
       "  {'conversations': [[{'from': 'human',\n",
       "      'value': '文本纠错：\\n\\n它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。'},\n",
       "     {'from': 'gpt',\n",
       "      'value': '它渐渐失去了青苍的颜色，变成嫩黄，变成柔绿，枝条变成细瘦，变成娇弱，好像病了的孩子。\\n\\nerrors:\"[]\"'}]]}],\n",
       " 1559)"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 18
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-28T06:16:21.110038Z",
     "start_time": "2024-08-28T06:16:21.099164Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 输出 JSONL 格式\n",
    "output_file_path = \"sharegpt_formatted_data_grammar.jsonl\"\n",
    "\n",
    "with open(output_file_path, 'w', encoding='utf-8') as f:\n",
    "    for entry in sharegpt_formatted_data:\n",
    "        f.write(json.dumps(entry, ensure_ascii=False) + '\\n')\n",
    "\n",
    "print(f\"数据已保存到 {output_file_path}\")"
   ],
   "id": "ba65e5a4325120d1",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "数据已保存到 sharegpt_formatted_data_grammar.jsonl\n"
     ]
    }
   ],
   "execution_count": 19
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## Few shot续写（optional）",
   "id": "5accbcd830414023"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-23T04:14:12.773797Z",
     "start_time": "2024-08-23T04:14:05.901888Z"
    }
   },
   "cell_type": "code",
   "source": [
    "def self_instruct_ds(sentence):\n",
    "    prompt = \"\"\"\n",
    "续写中文纠错训练样本集，标准纠错样本格式如下（jsonl格式）：\n",
    "\n",
    "说明：\n",
    "- id：样本id，标识而已，可为空。\n",
    "- original_text，原始文本：输入的原始文本。\n",
    "- errors，错误列表：使用 errors 数组来列出每个错误，包括原始错误文本片段（original_error）、错误类型（type）和正确的文本（correct）。这有助于模型更精确地理解错误。\n",
    "- type，错误类型：定义4种错误类型，spelling_error（拼写错误）、grammar_error（语法错误）、missing_word（缺少单词）、extra_word（多余单词）。\n",
    "- correct_text，正确文本：正确的文本，即纠正后的文本。\n",
    "\n",
    "要求：\n",
    "1.只按标准纠错样本格式输出处理后的jsonl结果，不需要解释。\n",
    "2.请确保输出的jsonl格式正确，以便后续处理。\n",
    "3.errors是个列表，如果有多个错误，就都写入；如果没有错误，就是空列表。\n",
    "4.续写5个样本，注意提升样本的多样性、丰富度，续写的样本errors不要为空，错误类型只能属于上面4种错误类型（spelling_error（拼写错误）、grammar_error（语法错误）、missing_word（缺少单词）、extra_word（多余单词））的范围内，可以包括多个错误。\n",
    "\n",
    "样本：\n",
    "{\"id\": \"A2-0023-1\",\"original_text\": \"下个星期，我跟我朋唷打算去法国玩儿。\",\"errors\":[{\"original_error\": \"朋唷\",\"type\": \"spelling_error\",\"correct\": \"朋友\"}],\"correct_text\": \"下个星期，我跟我朋友打算去法国玩儿。\"}\n",
    "{\"id\": \"A2-0029-1\",\"original_text\": \"对不气，最近我很忙，所以我不会去妳的。\",\"errors\":[{\"original_error\": \"不气\",\"type\": \"spelling_error\",\"correct\": \"不起\"},{\"original_error\": \"妳的\",\"type\": \"grammar_error\",\"correct\": \"你的\"}],\"correct_text\": \"对不起，最近我很忙，所以我不会去你的。\"}\n",
    "{\"id\": \"A2-0031-1\",\"original_text\": \"他昨天去了图书馆借了很多书籍。\",\"errors\":[{\"original_error\": \"书籍\",\"type\": \"extra_word\",\"correct\": \"书\"}],\"correct_text\": \"他昨天去了图书馆借了很多书。\"}\n",
    "{\"id\": \"A2-0032-1\",\"original_text\": \"今天我得去趟超市买牛奶。\",\"errors\":[{\"original_error\": \"去趟\",\"type\": \"missing_word\",\"correct\": \"去一趟\"}],\"correct_text\": \"今天我得去一趟超市买牛奶。\"}\n",
    "{sentence}\n",
    "    \"\"\"\n",
    "\n",
    "    try:\n",
    "        res = request_gpt4o_azure(prompt.replace(\"{sentence}\", sentence))\n",
    "    except Exception as e:\n",
    "        print(e)\n",
    "        res = \"\"\n",
    "    \n",
    "    # 返回结果，处理\n",
    "    clean_res = []\n",
    "    try:\n",
    "        if res:\n",
    "            res = res.strip()\n",
    "            lines = res.split(\"\\n\")\n",
    "            for i in lines:\n",
    "                if i.startswith(\"```\"):\n",
    "                    continue\n",
    "                if i.startswith(\"{\"):\n",
    "                    d = json.loads(i)\n",
    "                    clean_res.append(d)\n",
    "            \n",
    "    except Exception as e:\n",
    "        print(e)\n",
    "    origin_res = res\n",
    "    return origin_res, clean_res\n",
    "\n",
    "# 示例问题和回答\n",
    "q = \"\"\"\n",
    "{'id': 'grammar-2', 'original_text': '可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着音响，尘埃和湿气的。', 'errors': [{'original_error': '音响', 'type': 'word_choice_error', 'correct': '噪音'}, {'original_error': '的', 'type': 'extra_word', 'correct': ''}], 'correct_text': '可是在从原棉制成纱线的过程，就不像穿着光滑舒适的衣服那样让人愉快了：纱厂工人终日面临着噪音，尘埃和湿气。'}\n",
    "{'id': '4', 'original_text': '老同志不但关心我，就是和他一起入伍的新同志也经常帮助我，这使我非常感动。', 'errors': [{'original_error': '就是', 'type': 'grammar_error', 'correct': '而且'}], 'correct_text': '老同志不但关心我，而且和他一起入伍的新同志也经常帮助我，这使我非常感动。'}\n",
    "{\"id\": \"-\", \"original_text\": \"从争做中国好网民，才年汇聚网络正能量，占领主战场，让各种网络谣言、欺诈、色情信息没有立足之处，从而构建起无限生机与正义的中国网络正能量。\", \"errors\": [{\"original_error\": \"才年\", \"type\": \"spelling_error\", \"correct\": \"才能\"}], \"correct_text\": \"从争做中国好网民，才能汇聚网络正能量，占领主战场，让各种网络谣言、欺诈、色情信息没有立足之处，从而构建起无限生机与正义的中国网络正能量。\"}\n",
    "\"\"\"\n",
    "\n",
    "# 发送请求并获取评估\n",
    "origin_res, r = self_instruct_ds(q)\n",
    "origin_res, r"
   ],
   "id": "5d5bc4327487f8e",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "('```jsonl\\n{\"id\": \"A2-0040-1\",\"original_text\": \"昨天晚上我和家人一齐吃了晚饭。\",\"errors\":[{\"original_error\": \"一齐\",\"type\": \"spelling_error\",\"correct\": \"一起\"}],\"correct_text\": \"昨天晚上我和家人一起吃了晚饭。\"}\\n{\"id\": \"A2-0041-1\",\"original_text\": \"他对于数学题目完全理解不。\",\"errors\":[{\"original_error\": \"不\",\"type\": \"missing_word\",\"correct\": \"不了解\"}],\"correct_text\": \"他对于数学题目完全理解不了解。\"}\\n{\"id\": \"A2-0042-1\",\"original_text\": \"这个小说书封面很好看。\",\"errors\":[{\"original_error\": \"小说书\",\"type\": \"extra_word\",\"correct\": \"小说\"}],\"correct_text\": \"这个小说封面很好看。\"}\\n{\"id\": \"A2-0043-1\",\"original_text\": \"明天早上我打算去跑步公园。\",\"errors\":[{\"original_error\": \"跑步公园\",\"type\": \"missing_word\",\"correct\": \"去公园跑步\"}],\"correct_text\": \"明天早上我打算去公园跑步。\"}\\n{\"id\": \"A2-0044-1\",\"original_text\": \"我们已经讨论问题了很多次。\",\"errors\":[{\"original_error\": \"问题了\",\"type\": \"grammar_error\",\"correct\": \"这个问题\"}],\"correct_text\": \"我们已经讨论这个问题很多次了。\"}\\n```',\n",
       " [{'id': 'A2-0040-1',\n",
       "   'original_text': '昨天晚上我和家人一齐吃了晚饭。',\n",
       "   'errors': [{'original_error': '一齐',\n",
       "     'type': 'spelling_error',\n",
       "     'correct': '一起'}],\n",
       "   'correct_text': '昨天晚上我和家人一起吃了晚饭。'},\n",
       "  {'id': 'A2-0041-1',\n",
       "   'original_text': '他对于数学题目完全理解不。',\n",
       "   'errors': [{'original_error': '不',\n",
       "     'type': 'missing_word',\n",
       "     'correct': '不了解'}],\n",
       "   'correct_text': '他对于数学题目完全理解不了解。'},\n",
       "  {'id': 'A2-0042-1',\n",
       "   'original_text': '这个小说书封面很好看。',\n",
       "   'errors': [{'original_error': '小说书',\n",
       "     'type': 'extra_word',\n",
       "     'correct': '小说'}],\n",
       "   'correct_text': '这个小说封面很好看。'},\n",
       "  {'id': 'A2-0043-1',\n",
       "   'original_text': '明天早上我打算去跑步公园。',\n",
       "   'errors': [{'original_error': '跑步公园',\n",
       "     'type': 'missing_word',\n",
       "     'correct': '去公园跑步'}],\n",
       "   'correct_text': '明天早上我打算去公园跑步。'},\n",
       "  {'id': 'A2-0044-1',\n",
       "   'original_text': '我们已经讨论问题了很多次。',\n",
       "   'errors': [{'original_error': '问题了',\n",
       "     'type': 'grammar_error',\n",
       "     'correct': '这个问题'}],\n",
       "   'correct_text': '我们已经讨论这个问题很多次了。'}])"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 32
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-23T04:14:12.779045Z",
     "start_time": "2024-08-23T04:14:12.776223Z"
    }
   },
   "cell_type": "code",
   "source": "",
   "id": "f5e1973d9f83c9bc",
   "outputs": [],
   "execution_count": 32
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-23T04:14:12.783143Z",
     "start_time": "2024-08-23T04:14:12.780899Z"
    }
   },
   "cell_type": "code",
   "source": "",
   "id": "7b9250d161e1435c",
   "outputs": [],
   "execution_count": 32
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-23T04:14:12.786468Z",
     "start_time": "2024-08-23T04:14:12.784687Z"
    }
   },
   "cell_type": "code",
   "source": "",
   "id": "ab01299d37977810",
   "outputs": [],
   "execution_count": 32
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": "",
   "id": "3453a5263ae6c634",
   "outputs": [],
   "execution_count": null
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
